• 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ②.成员赋值

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

    protoTest::DemoMsg msg;
    msg.set_a(10);
    msg.set_b(0.25);
    
    cout << msg.DebugString() << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    ③.成员读取

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

    protoTest::DemoMsg msg;
    msg.set_a(10);
    msg.set_b(0.25);
    
    cout << "a " << msg.a() << endl;
    cout << "b " << msg.b() << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    ④.成员清空

    使用 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    文本类型读写

    ①.message 示例

    message DemoMsg
    {
      string   a = 1;
      bytes    b = 2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ②.成员赋值

    使用 set 方法赋值:

    protoTest::DemoMsg msg;  
    msg.set_a("1234");
    msg.set_b("测试");
    cout << msg.DebugString() << endl;
    
    • 1
    • 2
    • 3
    • 4

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

    protoTest::DemoMsg msg; 
    msg.set_a("1234");
        
    msg.mutable_b()->assign("测试");
    cout << msg.DebugString() << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    使用 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ③.成员读取

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

    protoTest::DemoMsg msg; 
    msg.set_a("1234");
    msg.set_b("测试");
        
    cout << "a " << msg.a() << endl;
    cout << "b " << *msg.mutable_b() << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    数组类型读写

    ①.message 示例

    message DemoMsg
    {
      repeated  double a = 1;
    }
    
    • 1
    • 2
    • 3
    • 4

    ②.添加新值

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

    protoTest::DemoMsg msg;     
    msg.add_a(0.2);
    msg.add_a(0.5);
    cout << msg.DebugString() << endl;
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    ③.修改指定元素

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    ④.元素遍历

    使用 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) << " ";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    ⑤.元素删除

    使用 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    枚举类型读写

    ①.message 示例

    enum demoEnum
    {
        A = 0;
        B = 1;
        C = 2;
    }
    message DemoMsg
    {
       demoEnum  a = 1;    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ②.成员赋值

    使用枚举值直接赋值:

    protoTest::DemoMsg msg; 
    msg.set_a(protoTest::B);
    cout << msg.DebugString() << endl;
    
    • 1
    • 2
    • 3

    使用整形数字赋值:

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

    在这里插入图片描述

    ③.成员读取

    protoTest::DemoMsg msg; 
    msg.set_a(protoTest::B);
    
    auto a = msg.a();
    cout << a << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    SettingsProvider
    QT基础教程(Hello QT)
    前端工作总结213-实现分页秀呀
    数据分析与取证capture.pcapng
    9成企业打算发年终奖,人均到手2.3万元
    Android:Handler
    贝叶斯网络详解
    静态代码块和构造代码块
    【文件管理】关于上传下载文件的设计
    Redis数据库角色:不只是缓存,还可以作为主数据库!
  • 原文地址:https://blog.csdn.net/lizhichao410/article/details/126032469