c++如何用cereal库序列化 c++ header-only序列化【指南】

16次阅读

cereal库是header-only的c++序列化方案,只需包含头文件;为自定义类型提供serialize成员函数或友元函数,并选择jsON/xml/Binary归档类型。

c++如何用cereal库序列化 c++ header-only序列化【指南】

用 cereal 库做 C++ 序列化非常轻量,因为它完全是 header-only 的,无需编译安装,只需包含头文件就能用。核心在于为自定义类型提供 serialize 成员函数或友元函数,并选择合适的归档类型(如 jsonArchiveBinaryArchiveXMLArchive)。

1. 快速开始:引入 cereal 并序列化基础类型

cereal 不依赖外部构建系统,下载单头文件 cereal/include/cereal/cereal.hpp(或通过 vcpkg/conan 安装),然后在代码中包含即可:

#include json.hpp>
#include
#include

cereal 已为常见 STL 类型(std::Stringstd::vectorstd::map 等)提供了内置支持,无需额外声明。

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

2. 为自定义类添加序列化支持

对你的结构体或类,只需定义一个 serialize 成员函数(或使用 CEREAL_SERIALIZE_FUNCTION_NAME 宏),接受归档对象引用:

Struct Person {
  std::string name;
  int age;
  std::vector scores;

  template
  void serialize(Archive& ar) {
    ar(CEREAL_NVP(name), CEREAL_NVP(age), CEREAL_NVP(scores));
  }
};

  • CEREAL_NVP 是“named value pair”,用于 JSON/XML 输出时保留字段名;二进制归档中可省略,直接写 ar(name, age, scores)
  • friend + 非成员 serialize 函数实现

3. 实际保存与加载:选对归档类型

不同归档对应不同格式和用途,用法一致:

// 写入 JSON 文件
{
  std::ofstream os(“person.json“);
  cereal::JSONOutputArchive ar(os);
  Person p{“Alice”, 30, {95.5, 87.0}};
  ar(CEREAL_NVP(p));
}

// 读回
{
  std::ifstream is(“person.json”);
  cereal::JSONInputArchive ar(is);
  Person p;
  ar(CEREAL_NVP(p));
}

  • JSONArchive:人类可读,调试友好,但体积大、性能低
  • BinaryArchive:紧凑高效,跨平台(小端序),适合本地存储或 IPC
  • XMLArchive:结构清晰,兼容性强,但更冗长
  • std::stringstream,方便内存中序列化/反序列化

4. 注意事项与实用技巧

cereal 简单但有几个关键点容易踩坑:

  • cereal::base_class() 和宏 CEREAL_REGISTER_TYPE(启用运行时类型信息)
  • load_minimal/save_minimalload_and_construct 控制细节
  • find_package(cereal) 或 add_subdirectory 引入
text=ZqhQzanResources