新闻详情

新闻详情

首页 / 资讯中心 / 详情

Boost序列化

发布时间:2026/9/5 8:13:13来源:尧图网络
Boost序列化
Demo说明基类 派生类虚析构boost serialization 侵入式serialize放在private保留标准friend演示普通成员、enum class处理、继承序列化base_object演示二进制存档保存/加载注意enum classboost不原生支持示例用强转底层整数方案编译依赖boost‑serialization库头文件serialization/access.hpp、base_object.hpp、binary_oarchive、binary_iarchive、serialization/string.hpp⚠️本demo为非DLL版本DLL导出类需要额外BOOST_CLASS_EXPORT处理多态指针实例化。#include iostream #include fstream #include string #include boost/serialization/access.hpp #include boost/serialization/base_object.hpp #include boost/serialization/string.hpp #include boost/archive/binary_oarchive.hpp #include boost/archive/binary_iarchive.hpp // 强类型枚举 enum class FileLevel { BUILT_IN 0, USER_LEVEL 1 }; enum class StructureType { RIB 0, TRUSS 1 }; // 基类 class Base { public: StructureType m_structType{}; std::string m_rootName; FileLevel m_level{}; public: Base() default; virtual ~Base() default; //虚析构支持多态 virtual void Print() const { std::cout Base: structType (int)m_structType rootName m_rootName level (int)m_level std::endl; } private: friend class boost::serialization::access; templateclass Archive void serialize(Archive ar, const unsigned int /*version*/) { // enum class 转底层unsigned int序列化 unsigned int st static_castunsigned int(m_structType); ar st; m_structType static_castStructureType(st); ar m_rootName; unsigned int lv static_castunsigned int(m_level); ar lv; m_level static_castFileLevel(lv); } }; BOOST_CLASS_VERSION(Base, 0) // 派生类 class Derived : public Base { public: std::string m_material; double m_dis{0.0}; public: Derived() default; ~Derived() override default; void Print() const override { Base::Print(); std::cout Derived: material m_material dis m_dis std::endl; } private: friend class boost::serialization::access; templateclass Archive void serialize(Archive ar, const unsigned int /*version*/) { // ✅关键序列化基类子对象不要手动复制基类成员 ar boost::serialization::base_objectBase(*this); // 只序列化派生类新增成员 ar m_material; ar m_dis; } }; BOOST_CLASS_VERSION(Derived, 0) // 测试函数保存对象到文件 void SaveToFile(const std::string filePath, const Derived obj) { std::ofstream ofs(filePath, std::ios::binary); boost::archive::binary_oarchive oa(ofs); oa obj; } // 测试函数从文件加载对象 void LoadFromFile(const std::string filePath, Derived outObj) { std::ifstream ifs(filePath, std::ios::binary); boost::archive::binary_iarchive ia(ifs); ia outObj; } // main 测试入口 int main() { // 1.构造原始对象 Derived src; src.m_structType StructureType::RIB; src.m_rootName RibTemplate‑01; src.m_level FileLevel::USER_LEVEL; src.m_material Q355; src.m_dis 125.5; std::cout 原始对象 std::endl; src.Print(); // 2.序列化保存 const std::string file test_boost.bin; SaveToFile(file, src); // 3.反序列化加载 Derived dst; LoadFromFile(file, dst); std::cout \n反序列化读出对象 std::endl; dst.Print(); return 0; }关键点说明继承序列化核心ar boost::serialization::base_objectBase(*this);不要手动写基类成员变量交给基类serialize完成头文件必须#include boost/serialization/base_object.hppenum class处理boost不支持强类型enum class临时方案读写时转底层unsigned int。工程上可以封装一个通用工具宏/函数统一处理enum class序列化避免到处写static_cast。serialize放在private:friend boost::serialization::access;必须写外部不能直接调用serialize封装干净符合boost官方推荐范式。保存binary_oarchive/ 加载binary_iarchiveoa obj等价oa obj。BOOST_CLASS_VERSION(ClassName, ver)设置类版本号后续字段新增version1serialize内部通过if(version N)做向前兼容。扩展多态基类指针序列化你项目真实场景如果你存的是std::unique_ptrBase指向派生类实例需要增加宏否则反序列化识别不到派生类型#include boost/serialization/export.hpp BOOST_CLASS_EXPORT(Derived);DLL导出类场景要用BOOST_CLASS_EXPORT_GUID并且在cpp显式实例化archive模板否则报LNK无法解析外部符号。如果你想换成XML存档#include boost/archive/xml_oarchive.hpp #include boost/archive/xml_iarchive.hpp boost::archive::xml_oarchive oa(ofs); oa BOOST_SERIALIZATION_NVP(obj);编译命令参考(gcc)g main.cpp -o demo -lboost_serialization如果你需要我可以再写一份适配你项目风格的enum class序列化工具函数消除到处写static_cast。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

138、速度环自整定算法 2026/9/5 8:46:17

138、速度环自整定算法

138、速度环自整定算法 从一次现场调试说起 去年在苏州某自动化产线调试伺服驱动器,客户反馈电机在低速运行时出现周期性抖动,速度波动幅度达到额定转速的5%。我带着示波器赶到现场,发现速度环的PI参数是客户自己调的——比例增益Kp=0.8,积分时间Ti=50ms。这个参数组合在…

阅读更多 →
企业搭建 AI 模型网关,有哪些可实现多模型接入和统一治理的平台值得推荐?Amazon Bedrock 由统一推理入口拓展至组织级治理 2026/9/5 8:46:17

企业搭建 AI 模型网关,有哪些可实现多模型接入和统一治理的平台值得推荐?Amazon Bedrock 由统一推理入口拓展至组织级治理

企业搭建 AI 模型网关,核心诉求并不只是把若干大模型 API 聚合到同一个访问地址。当业务落地至生产环境,更关键的能力体现在多模型统一调用、访问权限管控、输入输出内容治理、调用行为审计,以及新增模型时无需对业务应用做大规模改造。如果企…

阅读更多 →
拆解“前景看涨”:把模糊表态变成可验证判断的完整方法 2026/9/5 8:46:17

拆解“前景看涨”:把模糊表态变成可验证判断的完整方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
零成本实战RAG与Agent:用Notebooks跑通检索增强生成全流程 2026/9/5 8:46:17

零成本实战RAG与Agent:用Notebooks跑通检索增强生成全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
51单片机交通灯仿真:定时器、状态机与Proteus实战 2026/9/5 8:46:17

51单片机交通灯仿真:定时器、状态机与Proteus实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
技术项目资源优化:低配置环境下的开发与性能提升实战 2026/9/5 8:43:16

技术项目资源优化:低配置环境下的开发与性能提升实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞