栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

protobuf 中基础数据类型的读写

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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(2));
cout << msg.DebugString() << endl;

③.成员读取

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031735.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号