protobuf c++编程笔记

 更新时间:2021年08月23日 15:52:45   作者:龙海L  
这篇文章主要介绍了Protobuf的c++编程笔记,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

字段内容的定义

//文件名:addressbook.proto
syntax = "proto2";//proto版本
//.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。
//包的声明符会根据使用语言的不同影响生成的代码。对于C++,产生的类会被包装在C++的命名空间中。
package tutorial;package声明符
message Person {
  required string name = 1;//姓名,= 1 二进制编码中使用的唯一 “标记”
  required int32 id = 2;//ID
  optional string email = 3;//email
  enum PhoneType {//枚举消息类型
    MOBILE = 0;//proto3版本中,首成员必须为0,成员不应有相同的值
    HOME = 1;
    WORK = 2;
  }
//
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
  repeated PhoneNumber phones = 4;//phones为数组
}
message AddressBook {
  repeated Person people = 1;
}

修饰符

  • required 必须提供该字段的值,否则消息会被认为是”未初始化的“
  • optional

表示属性值为可选项,不指定使用默认值。int和char数据类型默认为0,string默认为空,bool默认为false,嵌套message默认为构造,枚举为第一个

  • repeated 表示该属性为重复字段,可看走是动态数组,类似于c++中的vector

如果为optional属性,发送端没有包含该属性,则接收端在解析式采用默认值。对于默认值,如果已设置默认值,则采用默认值,如果未设置,则类型特定的默认值为使用,例如string的默认值为”“。

字段类型

  • package

相当于namespace

  • message

相当于clas

  • name

相当于属性值

引用方式

  • 类成员函数变量

package::message.方法()

  • 标准meaasge方法

1.bool IsInitialized() const;: 检查是否已设置所有必填 required 字段

2.string DebugString() const;: 返回 message 的人类可读表达,对调试特别有用

3.void CopyFrom(const Person& from);用给定的 message 的值覆盖 message

4.void Clear();: 将所有元素清除回 empty 状态

不同字段的方法

1)optional修饰的基本类型:

  • set_属性名(val) :初始化修改属性值;
  • 属性名():获取属性值,只读模式,返回类型是::google::protobuf::int64;

2)optional修饰的对象类型:

  • 属性名():返回只读的属性类型对象的引用,属性类型是指pb中定义的对象;
  • mutable_属性名():返回可修改的属性类型对象的指针,属性类型是指pb中定义的对象;
  • set_属性名():初始化设置字段值

3)repeated修饰的基本类型:

  • add_属性名(val):向属性集合中添加元素;
  • 属性名_size():获取集合大小;
  • 属性名(i):返回集合中某一个元素,返回类型::google::protobuf::int64;
  • 属性名():返回只读的整个集合的引用,返回的集合类型是const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >&,可以使用iterator来迭代遍历,可用于修改;
  • mutable_属性():返回可修改的整个集合的指针,返回的集合类型::google::protobuf::RepeatedField< ::google::protobuf::int64 >*,可以使用iterator来迭代遍历,可用于修改;
  • set_属性名(int,x):设置repeated中元素的值

4)repeated修饰的对象类型:

  • add_属性名():返回可修改的属性类型对象的指针(集合中的一个元素),属性类型是指pb中定义的对象;
  • 属性名_size():获取集合大小;

属性名(i):返回集合中某一个元素,返回的是只读的属性类型对象的引用,属性类型是指pb中定义的对象;

  • mutable_属性名(i):返回集合中某一个元素,返回的是可修改的属性类型对象的指针,属性类型是指pb中定义的对象;
  • 属性名():返回只读的整个集合的引用,集合类型是const ::google::protobuf::RepeatedPtrField< pb定义的对象>& XXX const;,可以使用iterator来迭代遍历;
  • mutable_属性名():返回可修改的整个集合的指针,集合类型是::google::protobuf::RepeatedPtrField< pb定义的对象>*,可以使用iterator来迭代遍历;

序列化

  • required字段需要初始化,可以通过IsInitialized来检查是否完成message对象的初始化
  • SerializedAsString(),SerializedToString(std::string* output) 把meaage编码进output
  • SerializedToArray(void*,int)把message编码进数组buff
  • SerializedToOstream(ostream*)把message编码到输出流
  • ByteSize()获取二进制字节序的大小,可用于初始化存放容器

反序列化

  • ParseFromString(std::string& data) 把data解码到message
  • ParseFromArray(char* buf,int size)把buf解码到message,效率比第一个快很多
  • ParseFromIstream(istream*)从istream输入流解码到message
  • has_xxx()用于检查相应字段是否存在数据
  • xxx_size()用于确定repeated字段是否存在,0表示未序列化

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • OpenCV实现抠图工具

    OpenCV实现抠图工具

    这篇文章主要为大家详细介绍了OpenCV实现抠图工具,文中示例代码介绍的非常详细,具有一定为大家详细的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言线索二叉树基础解读

    C语言线索二叉树基础解读

    线索二叉树还是按照链二叉树的方法创建,只不过在结点原本为空的左指针改为指向该结点在中序遍历中的前驱,结点原本为空的右指针改为指向该结点在中序遍历中的后继,也就是说把空的指针给利用了起来
    2022-04-04
  • 详解C++编程中的虚函数

    详解C++编程中的虚函数

    这篇文章主要介绍了详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下
    2015-09-09
  • OpenCV 图像金字塔的实现示例

    OpenCV 图像金字塔的实现示例

    本文将结合实例代码,介绍OpenCV 图像金字塔,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • OpenCV 视频中火焰检测识别实践

    OpenCV 视频中火焰检测识别实践

    本文主要介绍了OpenCV 视频中火焰检测识别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++版本基于ros将文件夹中的图像转换为bag包

    C++版本基于ros将文件夹中的图像转换为bag包

    这篇文章主要介绍了C++版本基于ros将文件夹中的图像转换为bag包,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • c语言经典习题之逆序字符串详解

    c语言经典习题之逆序字符串详解

    这篇文章主要为大家介绍了c语言习题之逆序字符串,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言开发实现通讯录管理系统

    C语言开发实现通讯录管理系统

    这篇文章主要为大家详细介绍了C语言开发实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++获取内存使用情况小结

    C++获取内存使用情况小结

    在程序编程过程中,为了防止出现内存泄漏情况出现,需要持续关注内存程序内存占用情况,本文主要介绍了C++获取内存使用情况小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C/C++中不同数据类型之间的转换详解

    C/C++中不同数据类型之间的转换详解

    这篇文章主要介绍了C/C++中不同数据类型之间的转换详解,数据类型转换是计算机编程中常见的操作,用于将一个数据类型转换为另一个数据类型,本文将对不同数据类型之间的转换作出说明,需要的朋友可以参考下
    2023-10-10

最新评论