0

0

C++如何使用Protobuf进行数据序列化?(入门教程)

冰火之心

冰火之心

发布时间:2025-12-31 17:47:02

|

561人浏览过

|

来源于php中文网

原创

Protobuf序列化C++数据需三步:写.proto文件定义结构→用protoc生成C++类→在代码中创建、序列化和解析对象;示例含环境安装、person.proto定义、生成person.pb.h/cc及main.cpp序列化/反序列化流程。

c++如何使用protobuf进行数据序列化?(入门教程)

用 Protobuf 序列化 C++ 数据,核心是三步:写 .proto 文件定义结构 → 用 protoc 编译生成 C++ 类 → 在代码中创建、序列化和解析对象。

1. 安装 Protobuf 并准备环境

确保系统已安装 protoc 编译器和 C++ 运行时库:

  • Linux/macOS:推荐用包管理器安装(如 apt install protobuf-compiler libprotobuf-devbrew install protobuf
  • Windows:下载预编译二进制包,把 protoc.exe 加入 PATH,并链接 libprotobuf.lib
  • 验证:终端运行 protoc --version,应输出类似 libprotoc 3.21.12

2. 编写 .proto 文件定义数据结构

新建 person.proto,描述一个简单联系人:

syntax = "proto3";
package tutorial;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  repeated string phone = 4;
}

注意点:

立即学习C++免费学习笔记(深入)”;

  • syntax = "proto3" 是必须声明
  • package 防止命名冲突,会映射为 C++ 命名空间
  • 字段编号(= 1, = 2)不能重复,建议从 1 开始连续编号
  • repeated 表示可变长数组(对应 std::vector

3. 生成 C++ 代码

执行命令生成头文件和源文件:

拍客piikee竞拍系统
拍客piikee竞拍系统

拍客竞拍系统是一款免费竞拍网站建设软件,任何个人可以下载使用,但未经商业授权不能进行商业活动,程序源代码开源,任何个人和企业可以进行二次开发,但不能以出售和盈利为目的。安装方法,将www文件夹里面的所有文件上传至虚拟主机,在浏览器执行http://你的域名/install.php或者直接导入数据库文件执行。本次升级优化了一下内容1,程序和模板完美分离。2,优化了安装文件。3,后台增加模板切换功能。

下载
protoc --cpp_out=. person.proto

会生成 person.pb.hperson.pb.cc。在项目中包含头文件并链接 protobuf 库即可使用。

编译时需加链接选项:-lprotobuf(g++ 示例):

g++ main.cpp person.pb.cc -lprotobuf -o demo

4. 在 C++ 中序列化与反序列化

以下是最简完整示例:

#include "person.pb.h"
#include 
#include 

int main() {
  tutorial::Person person;
  person.set_name("Alice");
  person.set_id(123);
  person.set_email("alice@example.com");
  person.add_phone("123-4567");

  // 序列化到文件
  std::ofstream output("person.dat", std::ios::binary);
  person.SerializeToOstream(&output);

  // 反序列化
  tutorial::Person restored;
  std::ifstream input("person.dat", std::ios::binary);
  restored.ParseFromIstream(&input);

  std::cout << restored.name() << ", " << restored.id() << "\n";
  return 0;
}

关键方法说明:

  • set_XXX() 设置标量字段(如 set_name()
  • add_XXX() 添加 repeated 字段元素(如 add_phone()
  • SerializeToOstream() 写入二进制流(高效紧凑)
  • ParseFromIstream() 从二进制流读取并填充对象
  • 所有 getter 方法(如 name(), phone(i))默认返回 const 引用,安全高效

不复杂但容易忽略:每次修改 .proto 后都要重新运行 protoc;C++ 类是值语义,支持拷贝、赋值和移动;序列化结果是二进制,不可读但体积小、速度快。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

6

2025.12.22

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

513

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1049

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

743

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

415

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2343

2023.08.08

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.3万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号