新闻中心

c++如何序列化和反序列化对象_c++ Protobuf与Boost.Serialization【教程】

2025-12-16
浏览次数:
返回列表
主流方案是Protobuf和Boost.Serialization:Protobuf跨语言高性能,需.proto定义+代码生成;Boost.Serialization专注C++生态,直接序列化复杂对象。选Protobuf用于多语言互通或RPC,Boost.Serialization适合纯C++项目快速持久化。

c++如何序列化和反序列化对象_c++ protobuf与boost.serialization【教程】

在 C++ 中序列化和反序列化对象,主流方案是 Protocol Buffers(Protobuf)Boost.Serialization。两者定位不同:Protobuf 侧重跨语言、高性能、网络传输;Boost.Serialization 更适合 C++ 单一生态内的对象持久化或进程间传递,支持指针、继承、多态等复杂结构。

Protobuf:定义 Schema + 自动生成代码

Protobuf 不直接操作 C++ 对象,而是先用 .proto 文件定义数据结构,再用 protoc 工具生成 C++ 类。这些类自带 SerializeToString() 和 ParseFromString() 方法。

  • 安装 protoc 编译器和 libprotobuf-dev(Linux)或通过 vcpkg/conan 安装
  • 写 hello.proto:syntax = "proto3"; message Person { string name = 1; int32 age = 2; repeated string email = 3; }
  • 生成代码:protoc --cpp_out=. hello.proto → 得到 hello.pb.h/.cc
  • 使用示例:Person p; p.set_name("Alice"); p.set_age(30); std::string data; p.SerializeToString(&data); // 序列化
    Person p2; p2.ParseFromString(data); // 反序列化

注意:必须严格匹配 proto 版本与运行时库版本;字段需有唯一 tag 编号;不支持直接序列化裸指针或非 POD 类型成员(需手动处理)。

Boost.Serialization:直接操作对象,语法简洁

Boost.Serialization 基于模板和宏,对已有类只需添加 serialize() 成员函数(或友元),即可实现深度序列化,天然支持 STL 容器、智能指针、继承关系。

Ghostwriter Ghostwriter

Replit推出的AI编程助手,一个强大的IDE,编译器和解释器。

Ghostwriter 238 查看详情 Ghostwriter

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

  • 需链接 -lboost_serialization,头文件包含 #include
  • 类中声明 serialize:template void serialize(Archive& ar, const unsigned int version) { ar & name & age & emails; }
  • 序列化到文件:std::ofstream ofs("person.txt"); boost::archive::text_oarchive oa(ofs); oa
  • 反序列化:std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); ia >> p2;

支持 text、binary、xml 归档格式;binary 最小最快;text 可读但体积大;需注意版本兼容性(version 参数可用来做迁移适配)。

选哪个?看场景

  • 要和 J*a/Python/Go 互通,或做 RPC 接口 → 选 Protobuf
  • 纯 C++ 项目,想快速存/读配置、缓存对象图、调试导出状态 → Boost.Serialization 更自然
  • 追求极致性能且数据结构稳定 → Protobuf binary 通常更快更省空间
  • 已有复杂类带 shared_ptr、虚函数、多重继承 → Boost.Serialization 开箱即用,Protobuf 需手动映射

基本上就这些。Protobuf 是工业级通信标准,Boost.Serialization 是 C++ 老炮儿的贴心工具——不复杂但容易忽略细节,动手试一次就清楚了。

以上就是c++++如何序列化和反序列化对象_c++ Protobuf与Boost.Serialization【教程】的详细内容,更多请关注其它相关文章!


# 多态  # 太仓网站建设比较好  # 网站建设 代表联系群众  # 网站建设未如期完成  # 台山网站推广费用  # seo私人接单  # 初创公司app推广营销  # 网站建设与维护的前景  # 佛山智能网站建设全包  # 沈阳食品网站建设  # seo定义网页内容有哪些  # 编解码  # 客户端  # 网络编程  # 尼克  # linux  # 高性能  # 已有  # 数据结构  # 序列化  # red  # 多语言  # stream  # c++  # ai  # 工具  # go  # java  # python 


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


相关推荐: Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  妖精动漫免费平台 妖精动漫官网资源观看网址  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  CSS布局中意外空白:解决padding-top导致的顶部间距问题  C#中解析不规范的HTML为XML 常见的坑与解决办法  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Golang指针如何与map组合使用_Golang map指针组合实践  Python中高效访问嵌套字典与列表中的键值对  C++ explicit关键字防止隐式转换_C++构造函数安全规范  Bing引擎入口最新2025 Bing搜索免费官方登录  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  Go语言HTML解析:利用Goquery精准获取指定元素内容  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  网易大神账号申诉需要多久_网易大神账号申诉流程说明  星露谷物语官网入口 星露谷物语游戏官网入口  Composer如何在生产环境安全地执行composer update  J*aScript中向JSON对象添加新属性的正确姿势  poki网页游戏推荐_poki免费游戏平台入口  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  拼多多赚钱渠道_拼多多收益来源  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  利用5118提升短视频内容效果_5118短视频关键词优化方法  AO3官方可用镜像 Archive of Our Own网页版最新入口  2026年CSGO开箱网站推荐 CSGO开箱平台精选  Steam官网入口直达 Steam注册及登录步骤  mc.js游戏直达 mc.js网页免下载版本秒进地址  顺丰快件物流信息 官方网站查询入口  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  Animex动漫社网入口地址 Animex动漫社网正版在线入口  R星幕后开发视频泄露 包含《GTA6》等多款大作  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  如何提高微信支付的安全性_微信支付安全防护与设置建议  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  AO3官方在线访问地址 Archive of Our Own最新镜像合集  极兔快递快件信息查询系统 极兔快递官网运单号追踪  《噬血代码2》新预告片发布 展示游戏剧情 

搜索