1.在protobuf的术语中,结构化数据被称为Message;proto文件非常类似java或者c语言的数据定义,可以使用C或C++风格的注释。
2.一个proto文件主要包含package定义、message定义和属性定义三部分。
package在C++中对应namespace;
Message在C++中对应class。Message中定义的全部属性在class中全部为private;
属性定义分为四部分:标注+类型+属性名+属性顺序号+【默认值】。
标注:
required:表示必选属性
potional:表示可选属性
repeated:表示重复字段,可看做是动态数组,类似于C++中的vector
3.使用message
类成员变量的访问:
在生成的.h文件中定义了类成员的访问方法。
获取成员变量值直接采用使用成员变量名,设置成员变量值,使用在成员变量名前加set_的方法;
对于普通成员变量提供has_方法判断变量值是否被设置;
提供clear_方法清除设置的变量值。
标准message方法:
生成的.h文件中的class都继承自::google::protobuf::Message类,Message类提供了一些方法可以检查或者操作整个message
编码和解码函数:
每个message类都提供了写入和读取message数据的方法
4.::google::protobuf::MessageLite 父类
::google::protobuf::Message 子类
5.何为protobuf?
protocol buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方式,它用于数据通信协议,数据存储等;
protocol buffers是一种灵活、高效、自动化机制的结构数据序列化方法;
可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
简单来说,就是protobuf只需要定义一个结构体,然后经编译,自动生成类;而这个结构体主要用与数据通信协议,数据存储。
6.序列化?
将结构数据或对象转换成能够被存储和传输的格式,同时应当要保证这个序列化结果在之后能够被重建回原来的结构数据或对象。
7.使用protobuf
1.创建.proto文件,定义数据结构
2.protoc编译.proto文件生成读写接口
在.proto文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输;
当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写,通过编译生成相应的接口代码;
比如:将对象序列化为一个二进制字符串
解析一个二进制字符串
将对象序列化成C++ ostream
解析C++ istream
设置各个变量的值
3.调用接口实现序列化、反序列化以及读写
针对第一步中定义的message,可以调用第二步中生成的接口
8.关于protobuf的一些思考
如果将protobuf、XML、JSON三者放到一起去比较,应该区分两个维度。
一个是数据结构化,一个是数据序列化。
这里的数据结构化主要面向开发或业务层面,数据序列化面向通信或存储层面,当然数据序列化也需要“结构”和“格式”,所以这两者之间的区别主要在于面向领域和场景不同,一般要求和侧重点也会有所不同。
用来实现传输 实现存储
proto -------------序列化----------------> 公共数据流
proto <------------反序列化---------------- 公共数据流
存放反序列化后的结构 如同内存一样,通过buffer+size+offset来控制
主要存放二进制数据流 = msg
总有一个结构体来存储
反序列化的结果