首先安装Protobuf编译器和库,然后编写.proto文件定义数据结构,接着使用protoc生成C++代码,最后在程序中包含生成的头文件并调用序列化与反序列化方法完成数据读写操作。

在C++中使用Protocol Buffers(简称Protobuf)进行数据序列化,是Google推荐的一种高效、轻量且跨平台的数据交换方式。它通过预定义的`.proto`文件描述数据结构,再由Protobuf编译器生成对应语言的代码,实现对象与二进制数据之间的快速序列化和反序列化。
1. 安装Protobuf编译器和库
要在C++项目中使用Protobuf,首先需要安装Protobuf编译器(protoc)和C++运行时库。
在Ubuntu系统中可通过以下命令安装:
- sudo apt-get install protobuf-compiler
- sudo apt-get install libprotobuf-dev
Windows用户可从GitHub发布页下载预编译的protoc可执行文件,并将路径加入环境变量。
立即学习“C++免费学习笔记(深入)”;
2. 编写.proto文件定义数据结构
创建一个名为person.proto的文件,定义一个简单的消息结构:
syntax = "proto3";package tutorial;
message Person {
string name = 1;
int32 age = 2;
string email = 3;
}
上述定义中,每个字段都有唯一的编号,用于在序列化时标识字段,避免因字段顺序变化导致解析错误。
3. 使用protoc生成C++代码
执行以下命令生成C++源码:
protoc --cpp_out=. person.proto命令执行后会生成两个文件:person.pb.h 和 person.pb.cc,包含Person类的定义和序列化方法。
4. 在C++代码中序列化和反序列化数据
包含生成的头文件,在程序中使用Person类进行操作:
#include "person.pb.h"#include iostream>
#include
int main() {
tutorial::Person person;
person.set_name("Alice");
person.set_age(30);
person.set_email("alice@example.com");
// 序列化到文件
std::ofstream output("person.data", std::ios::binary);
person.SerializeToOstream(&output);
output.close();
// 从文件反序列化
tutorial::Person person2;
std::ifstream input("person.data", std::ios::binary);
person2.ParseFromIstream(&input);
input.close();
std::cout std::cout std::cout
return 0;
}
编译时需链接Protobuf库:
g++ -o person_example person.pb.cc main.cpp -lprotobufProtobuf生成的类提供了SerializeToString、SerializeToArray等方法支持多种序列化形式,适用于网络传输或持久化存储。
基本上就这些。整个流程清晰:定义结构 → 生成代码 → 使用API读写数据。相比JSON或XML,Protobuf序列化后的数据更小,解析更快,适合对性能敏感的场景。只要保证发送方和接收方使用相同的.proto文件,就能确保数据正确解析。不复杂但容易忽略的是版本兼容性——新增字段应使用optional并保留字段号,避免破坏旧协议。










