Protobuf简易使用
ProtoBuf提供对数据的序列化和反序列化,ProtoBuf可以用于结构化数据的串行序列化,并且以Key-Value格式存储数据,因为采用二进制格式,所以序列化出来的数据比较少,作为网络传输的载体效率很高
参考资料
安装
源码下载与安装
1 | 以 protobuf 3.21.12 为例 |
动态库链接失败处理
可以使用$ protoc --version
测试是否安装成功
1 | 测试时发现动态库链接失败 |
快速上手
使用流程
确定数据格式,数据可简单可复杂,比如:
1
2
3
4
5
6
7
8
9
10
11
12// 要序列化的数据
// 第一种: 单一数据类型
int number;
// 第二种: 复合数据类型
struct Person
{
int id;
string name;
string sex;
int age;
};创建一个新的文件, 文件名随意指定, 文件后缀为 .proto
根据protobuf的语法, 编辑.proto文件
使用 protoc 命令将 .proto 文件转化为相应的 C++ 文件
- 源文件: xxx.pb.cc –> xxx对应的名字和 .proto文件名相同
- 头文件: xxx.pb.h –> xxx对应的名字和 .proto文件名相同
需要将生成的c++文件添加到项目中, 通过文件中提供的类 API 实现数据的序列化/反序列化
Protobuf与C++的类型对照
- 几个主要注意点:
- C++中的string到Protobuf中统一使用bytes比较好
- C++中的整型到Protobuf中为 int+size,如int→int32
- C++中的结构体与类对应到Protobuf中为message(消息体)
- Protobuf中其他类型最终也都要封装到消息体里
基本使用
1 | syntax = "proto3"; |
生成对应的.h和.c文件
1 | protoc <proto文件路径> --cpp_out=<输出路径> |
repeated关键字
- repeated标志对应的成员是动态数组
1 | syntax = "proto3"; |
枚举
- proto3 中的第一个枚举值必须为 0,第一个元素以外的元素值可以随意指定
1 | // 定义枚举类型 |
proto文件的导入
- 使用
import
语句在当前.ptoto中导入其它的.proto文件。这样就可以在一个.proto文件中引用并使用其它文件中定义的消息类型和枚举类型。
1 | syntax = "proto3"; |
包(package)
- 在 Protobuf 中,可以使用package关键字来定义一个消息所属的包(package)。包是用于组织和命名消息类型的一种机制,类似于命名空间的概念
- 在一个.proto文件中,可以通过在顶层使用package关键字来定义包:
1 | syntax = "proto3"; |
- 其他.proto文件导入以上文件后,可以通过
Dabing.Address
使用该文件定义的消息体Address - .c文件使用该proto文件生成的对象时,通过
Dabing::Address
使用该文件定义的消息体
Protobuf API
通过对象调用Protobuf API
成员操作
1 | // 获取成员的const版本(数组成员需要传入索引) |
序列化
1 | // 头文件目录: google\protobuf\message_lite.h |
反序列化
1 | // 头文件目录: google\protobuf\message_lite.h |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Yu的炼金工房!
评论