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()。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)