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

用 cereal 库做 C++ 序列化非常轻量,因为它完全是 header-only 的,无需编译安装,只需包含头文件就能用。核心在于为自定义类型提供 serialize 成员函数或友元函数,并选择合适的归档类型(如 JSONArchive、BinaryArchive 或 XMLArchive)。
1. 快速开始:引入 cereal 并序列化基础类型
cereal 不依赖外部构建系统,下载单头文件 cereal/include/cereal/cereal.hpp(或通过 vcpkg/conan 安装),然后在代码中包含即可:
#include
#include
#include
cereal 已为常见 STL 类型(std::string、std::vector、std::map 等)提供了内置支持,无需额外声明。
立即学习“C++免费学习笔记(深入)”;
2. 为自定义类添加序列化支持
对你的结构体或类,只需定义一个 serialize 成员函数(或使用 CEREAL_SERIALIZE_FUNCTION_NAME 宏),接受归档对象引用:
struct Person {
std::string name;
int age;
std::vector
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_minimal或load_and_construct控制细节 - find_package(cereal) 或
add_subdirectory引入











