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()。

 

posted @ 2023-08-02 16:40  _zxq  阅读(424)  评论(0编辑  收藏  举报