新闻中心

C++怎么使用Protobuf进行序列化_C++集成Google Protocol Buffers进行数据交换

2025-12-09
浏览次数:
返回列表
首先定义.proto文件描述数据结构,再用protoc生成C++代码,接着在项目中包含头文件并调用SerializeToOstream和ParseFromIstream实现序列化与反序列化,最后通过正确配置编译环境完成集成。

c++怎么使用protobuf进行序列化_c++集成google protocol buffers进行数据交换

在C++项目中使用Protobuf(Protocol Buffers)进行序列化和数据交换,是高效处理结构化数据的常见做法。Google Protocol Buffers 提供了跨平台、跨语言的数据序列化能力,特别适合网络通信和持久化存储。下面是完整的使用流程和代码示例。

定义.proto文件

首先需要编写一个.proto文件来描述你要序列化的数据结构。例如,创建一个名为person.proto的文件:

syntax = "proto3";
package example;

message Person {
  string name = 1;
  int32 age = 2;
  string email = 3;
}

这个文件定义了一个名为Person的消息类型,包含姓名、年龄和邮箱字段。

生成C++代码

使用protoc编译器将.proto文件编译为C++头文件和源文件:

protoc --cpp_out=. person.proto

执行后会生成两个文件:person.pb.hperson.pb.cc。这些文件包含了自动生成的C++类,可以直接在项目中使用。

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

包含生成的头文件,并使用Protobuf API进行序列化和反序列化操作。

序列化示例:

GemDesign GemDesign

AI高保真原型设计工具

GemDesign 652 查看详情 GemDesign

#include "person.pb.h"
#include stream>

int main() {
  example::Person person;
  person.set_name("张三");
  person.set_age(30);
  person.set_email("zhangsan@example.com");

  // 序列化到文件
  std::ofstream output("person.bin", std::ios::binary);
  if (!person.SerializeToOstream(&output)) {
    return -1;
  }
  return 0;
}

反序列化示例:

#include "person.pb.h"
#include

int main() {
  example::Person person;
  std::ifstream input("person.bin", std::ios::binary);
  if (!person.ParseFromIstream(&input)) {
    return -1;
  }

  // 输出读取的数据
  std::cout   std::cout   std::cout
  return 0;
}

集成到C++项目中

要让项目正确编译和链接Protobuf,需确保以下几点:

  • 安装Protobuf开发库(如Ubuntu下:sudo apt-get install libprotobuf-dev protobuf-compiler)
  • 在编译时包含Protobuf头文件路径
  • 链接libprotobuf

使用g++编译的命令示例:

g++ -I/usr/include -c person.pb.cc
g++ -I/usr/include -c main.cpp
g++ -o app person.pb.o main.o -lprotobuf

如果使用CMake,可添加:

find_package(Protobuf REQUIRED)
target_link_libraries(your_target ${PROTOBUF_LIBRARIES})

基本上就这些。只要定义好协议文件,生成代码,再调用SerializeToOstream或ParseFromIstream就能完成数据交换。Protobuf的优势在于体积小、速度快、支持多语言,非常适合服务间通信或配置文件存储。

以上就是C++怎么使用Protobuf进行序列化_C++集成Google Protocol Buffers进行数据交换的详细内容,更多请关注其它相关文章!


# protobuf  # emlog伪静态SEO链接方式  # 广州seo网站搜索优化  # 网站建设哪家效果不错  # 铁岭网站优化公司排名  # 清空  # 如何实现  # 如何将  # 转换为  # 头文件  # 数据交换  # 数据结构  # 邮箱  # c++  # go  # app  # ubuntu  # ai  # ios  # stream  # 多语言  # google  # 配置文件  # 序列化  # 新闻软文营销推广策划  # 安达网站推广方案  # 海宁网站建设北路小学  # 收费网站优化服务  # 滋补天猫店怎么做营销推广  # 招聘抖音seo 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AngularJS $http POST请求数据传递与Go后端接收实践  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  快手官方唯一登录入口 谨防山寨钓鱼网站  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  C++如何实现单例模式_C++设计模式之线程安全的单例写法  12306选座系统怎么选连座_12306选座多人连坐操作方法  Lar*el DB::listen 事件中的查询执行时间单位解析  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  ArrayList与LinkedList操作复杂度详解:遍历与修改  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  解决J*aScript中重复选择项的确认对话框显示问题  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  J*a实现学校排课程序_面向对象结构化项目示例  J*aScript:在map操作中高效处理空数组  如何在Promise链中优雅地中断后续then执行  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  Shopware订单对象中获取产品自定义字段的正确方法  优化Log4j2控制台输出性能:解决异步日志瓶颈  顺丰国际快递查询 国际件官方查询入口  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  AO3访问入口汇总 AO3网页版同人作品一键直达  12306选座怎么选到商务座_12306商务座选择与配置说明  如何在Promise链中有效终止错误处理后的执行  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  浏览器打开即用 美图秀秀网页版入口  J*a递归快速排序中静态变量导致数据累积问题的解决方案  如何将HTML表格多行数据保存到Google Sheet  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  如何更改在 Excel 中打开超链接时的默认浏览器  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  yandex入口引擎手机版 yandex安卓版下载入口  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  HTML空白字符处理机制:渲染、DOM与编码实践  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  一加 14R 快充无反应_一加 14R 充电优化  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  知音漫客官网漫画下载_知音漫客网页版阅读记录  在Qt QML中通过Python字典动态更新TextEdit内容的教程  c++20的std::jthread是什么_c++可中断线程与RAII式管理  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】 

搜索