如何在C++中使用Google Protocol Buffers?Protobuf序列化教程【数据交换】


C++中使用Protobuf的核心流程是:定义.proto文件、用protoc生成C++代码、在项目中包含头文件并调用序列化/反序列化接口;关键在于流程正确、依赖齐全、编译选项准确。

如何在c++中使用google protocol buffers?protobuf序列化教程【数据交换】

在C++中使用Google Protocol Buffers(Protobuf)的核心是:定义协议文件(.proto)、用protoc编译生成C++代码、在项目中包含并调用生成的类进行序列化/反序列化。关键不在语法多复杂,而在流程是否走对、依赖是否配齐、编译选项是否正确。

1. 安装Protobuf编译器和C++运行时库

Protobuf需要两部分:命令行工具 protoc(用于编译 .proto 文件),以及 C++ 的运行时库(提供序列化/解析功能)。

  • Linux(Ubuntu/Debian):sudo apt install protobuf-compiler libprotobuf-dev
  • macOS(Homebrew):brew install protobuf
  • Windows:下载预编译二进制包(GitHub Releases),解压后把 protoc.exe 加入系统 PATH
  • 验证安装:protoc --version 应输出类似 libprotoc 24.4

2. 编写 .proto 协议文件

这是数据结构的“契约”。例如创建 person.proto

syntax = "proto3";

package tutorial;

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

注意点:

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

  • 必须声明 syntax = "proto3"
  • 字段编号(如 = 1)不能重复,且尽量不修改——它决定了二进制格式的兼容性
  • repeated 对应 C++ 中的 std::vector
  • package 会映射为 C++ 命名空间(如 tutorial::Person

3. 用 protoc 生成 C++ 代码

在 .proto 文件所在目录执行:

CodeGeeX CodeGeeX

智谱AI发布的AI编程辅助工具插件,可以实现自动代码生成、代码翻译、自动编写注释以及智能问答等功能

CodeGeeX 191 查看详情 CodeGeeX
protoc --cpp_out=. person.proto

会生成两个文件:person.pb.hperson.pb.cc。它们包含完整的序列化逻辑和访问接口。

常见问题:

  • 报错 “No such file or directory”:确认当前路径正确,且 protoc 可执行
  • 想指定输出目录:protoc --cpp_out=../gen person.proto
  • 若用到其他 .proto(如 import "common.proto"),加 -I 指定搜索路径:protoc -I./include --cpp_out=. person.proto

4. 在C++项目中使用生成的类

以简单示例说明核心操作:

#include "person.pb.h"
#include <fstream>
#include <iostream>

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

  // 序列化到字符串
  std::string data;
  person.SerializeToString(&data);

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

  // 反序列化(从文件)
  tutorial::Person loaded;
  std::ifstream in("person.dat", std::ios::binary);
  loaded.ParseFromIstream(&in);

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

关键点:

  • 所有字段都有自动生成的 set_XXX()xxx()(getter)、add_XXX()(for repeated)方法
  • 序列化函数不抛异常,返回 bool 表示成功;务必检查返回值(尤其反序列化时)
  • 链接时需链接 -lprotobuf(CMake 中用 target_link_libraries(myapp protobuf)

基本上就这些。Protobuf 不是黑盒,它把“结构定义 → 二进制编码”的过程标准化了,真正难点在于设计好 .proto、管理好版本兼容、以及在构建系统中稳定集成。写对一个 .proto,跑通一次 SerializeToString,后面就顺了。

以上就是如何在C++中使用Google Protocol Buffers?Protobuf序列化教程【数据交换】的详细内容,更多请关注其它相关文章!


# git  # 编解码  # 这是  # 客户端  # 网络编程  # 如何在  # 数据交换  # 数据结构  # 序列化  # ios  # c++  # mac  # 工具  # ubuntu  # app  # 编码  # github  # windows  # go  # linux  # ai  # 网站建设怎么操作  # 辽源抖音seo排名  # 校园网站推广策划案  # 昆明 网站优化  # 关键词排名不匹配的原因  # 整合网络营销推广报价  # seo外包万博易  # 查询关键词搜索排名  # 台湾省律师网站推广  # seo动漫  # 而在  # 都有 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  使用Google服务账号实现Google Drive API无缝集成与文件访问  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】  C++ static关键字作用_C++静态成员变量与静态函数  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  PDF如何批量加注释_PDF多文件批注高亮操作教程  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  哔哩哔哩黑名单怎么查看  广州地铁app准妈咪徽章领取方法  search中maxlength属性用法解析  驱动人生:游戏修复指南  word文档行距怎么调?word文档调行距的操作步骤  《磁力猫》最好用的磁官网  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  猫眼app抢票快还是小程序快  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  t3出行如何使用微信支付  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  iphone16系列配置参数介绍  iPhone14无法连接蓝牙设备如何解决  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  键盘测试软件哪个好_键盘故障检测工具推荐  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  《单词速记宝》设置学习计划方法  Python高效统计字典嵌套列表值在目标列表中的出现次数  Django模型动态关联检查:高效管理复杂关系  解决异步Python机器人中同步操作的阻塞问题  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  J*aScript包管理器_Npm与Yarn对比  处理含命名空间的XML文件 Power Query中的高级技巧  VS Code中的Tailwind CSS IntelliSense插件使用技巧  Win10通知横幅停留时间修改 Win10自定义通知显示时长【技巧】  如何使用 Optional 类型并满足 Pylint 的类型检查  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  易车网官网直达入口 易车网在线登录入口  被称为海蜈蚣的海洋动物是  Lar*el Socialite单设备登录策略:实现用户唯一会话管理  Excel宏怎么删除_Excel中删除宏的详细操作流程  mysql怎么查询数据_mysql基础查询语句使用教程  《优志愿》修改手机号方法  六级准考证号怎么查_四六级准考证查询入口官网  mysql中如何配置字符集和排序规则_mysql字符集排序配置  基于键值条件高效映射 Pandas DataFrame 多列数据  CSS如何使用outline-offset与颜色组合突出元素边框 

 2025-12-14

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.