protobuf 中基础数据类型的读写

背景

protobuf 在生成的 C++ 代码中为 .proto 文件中的每个 message 生成了对应的 C++ 类,并提供了数据成员的读写方法。

生成的 C++ 类

①.类名

protobuf 在生成的 C++ 代码中为 .proto 文件中的每个 message 生成了对应的 C++ 类,其类名和 message 名称一样。

②.默认值

protobuf 生成的 C++ 类会为没有复制的字段设置默认值:数字类型默认值是 0 ;字符串类型默认值是空字符串;bool 类型默认是 false ;枚举类型默认为第一个值

③.clear 方法

执行其成员函数 clear 会把结构体的所有成员清空,即恢复到默认值状态。

④.DebugString 方法

调用类的成员函数 DebugString 可以把结构体转换成可打印及可识别的文本字符串,以方便代码调试。

数字类型读写

①.message 示例

message DemoMsg
{
  int32    a = 1;
  double   b = 2;
}

②.成员赋值

生成的类中成员的赋值函数名称是 set_XXX。

protoTest::DemoMsg msg;
msg.set_a(10);
msg.set_b(0.25);

cout << msg.DebugString() << endl;

在这里插入图片描述

③.成员读取

生成的类中成员的读取方法是成员的同名函数 XXX()。

protoTest::DemoMsg msg;
msg.set_a(10);
msg.set_b(0.25);

cout << "a " << msg.a() << endl;
cout << "b " << msg.b() << endl;

在这里插入图片描述

④.成员清空

使用 clear_xxx 方法,可以清空对应的成员,即把该成员还原成默认值。

 protoTest::DemoMsg msg;
   
 msg.set_a(10);
 msg.set_b(0.25);

 msg.clear_b();

 cout << "a " << msg.a() << endl;
 cout << "b " << msg.b() << endl;

文本类型读写

①.message 示例

message DemoMsg
{
  string   a = 1;
  bytes    b = 2;
}

②.成员赋值

使用 set 方法赋值:

protoTest::DemoMsg msg;  
msg.set_a("1234");
msg.set_b("测试");
cout << msg.DebugString() << endl;

使用 mutable 方法赋值,mutable_xxx 方法获取成员的指针:

protoTest::DemoMsg msg; 
msg.set_a("1234");
    
msg.mutable_b()->assign("测试");
cout << msg.DebugString() << endl;

在这里插入图片描述

使用 set_allocated 方法赋值,set_allocated _xxx 负责释放传入的指针:

protoTest::DemoMsg msg; 
msg.set_a("1234");
    
string* s = new string("测试");
msg.set_allocated_b(s);
cout << msg.DebugString() << endl;

③.成员读取

字符串成员的读取也可以使用 mutable_xxx 方法:

protoTest::DemoMsg msg; 
msg.set_a("1234");
msg.set_b("测试");
    
cout << "a " << msg.a() << endl;
cout << "b " << *msg.mutable_b() << endl;

在这里插入图片描述

数组类型读写

①.message 示例

message DemoMsg
{
  repeated  double a = 1;
}

②.添加新值

repeated 标记的成员使用 add_xxx 添加新的值:

protoTest::DemoMsg msg;     
msg.add_a(0.2);
msg.add_a(0.5);
cout << msg.DebugString() << endl;

在这里插入图片描述

③.修改指定元素

repeated 标记的成员使用 set_xxx 方法修改指定位置的元素值,下标从 0 开始。

protoTest::DemoMsg msg; 
    
msg.add_a(0.2);
msg.add_a(0.5);

msg.set_a(1, 0.9);

cout << msg.DebugString() << endl;

在这里插入图片描述

④.元素遍历

使用 xxx_size() 可以获取 repeated 标记的成员的个数:

protoTest::DemoMsg msg; 
msg.add_a(0.2);
msg.add_a(0.5);   
int size = msg.a_size();
for (int i = 0; i < size; ++i)
{
   cout << msg.a(i) << " ";
}

在这里插入图片描述

⑤.元素删除

使用 mutable_xxx 方法获取成员的指针,可以删除指定位置的元素:

protoTest::DemoMsg msg;    
msg.add_a(0.2);
msg.add_a(0.5);    
msg.mutable_a()->erase(msg.mutable_a()->begin());
cout << msg.DebugString() << endl;

在这里插入图片描述

枚举类型读写

①.message 示例

enum demoEnum
{
    A = 0;
    B = 1;
    C = 2;
}
message DemoMsg
{
   demoEnum  a = 1;    
}

②.成员赋值

使用枚举值直接赋值:

protoTest::DemoMsg msg; 
msg.set_a(protoTest::B);
cout << msg.DebugString() << endl;

使用整形数字赋值:

protoTest::DemoMsg msg; 
msg.set_a(static_cast<protoTest::demoEnum>(2));
cout << msg.DebugString() << endl;

在这里插入图片描述

③.成员读取

protoTest::DemoMsg msg; 
msg.set_a(protoTest::B);

auto a = msg.a();
cout << a << endl;

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值