protobuf在c++中的使用
一、安装
sudo apt install libprotobuf-dev protobuf-compiler
二、编辑proto文件,生成代码文件
proto语法分为“proto2”和”proto3“两个版本,指定方法是在proto文件中第一行写入:syntax = "proto3"; ,这样指定使用proto3版本的语法,如果不指定,默认是使用proto2的语法。
两个语法的区别:
-
字段修饰符:在proto2中,需要指定字段修饰符为optional(0个或者1个此字段)、required(1个此字段)或repeated(0个或多个此字段)。而在proto3中,支持的字段修饰符为singular(0个或者1个此字段)、repeated(0个或多个此字段),不指定字段修饰符的话默认字段修饰符是singular,相当于proto2中optional。
-
默认值:在proto2中,字段可以有默认值,在定义后使用[default = xx]来指定。而在proto3中,不支持指定默认值,字符串默认空字符串,字节默认空字节,bool类型默认false,数字类型默认0等等。
-
oneof:在proto2中,可以使用oneof关键字来定义一组互斥的字段,只能有一个字段被设置。而在proto3中,oneof功能保持不变,但默认情况下,一个oneof字段将占用1个字节的空间。
-
Unknown Fields:在proto2中,未知字段(即消息中定义了但解析时不存在的字段)会被保留在unknown_fields()中,以便后续处理。而在proto3中,未知字段会被丢弃,但是在3.5版本及以后,好像又支持未知字段了。
使用注意事项:
-
字段的默认值:由于proto3中所有字段都没有默认值,因此在升级到proto3时需要特别注意字段的默认值,以确保正确地处理消息。
-
proto2和proto3混用:proto2和proto3是不兼容的,不能在同一个消息中混用这两种版本的字段。
使用protoc --cpp_out=<输出目录> <proto文件> ,就可以生成对应的代码文件。
三、常用接口方法
bool SerializeToString(string* output):将当前结构体对象序列化为string字符串,存储在output中。
bool ParseFromString(const string& data):把string类型的数据,转换到结构体。
bool SerializeToArray(void* data, int size):将当前结构体对象序列化为字节数组,存储在buffer中,存储size个字节。
bool ParseFromArray(const void * data, int size):从buffer中解析字节数组,并更新当前结构体对象的值。
void Clear():清除全部的字段,还原为各字段的默认值。用这个方法的好处是可以复用此结构,不用重新分配内存。
int64_t ByteSizeLong() 或 int ByteSize():返回当前结构体对象序列化后的字节大小。ByteSize目前已经弃用,推荐使用ByteSizeLong()。