cereal库是header-only的C++序列化方案,只需包含头文件;为自定义类型提供serialize成员函数或友元函数,并选择JSON/XML/Binary归档类型。
用 cereal 库做 C++ 序列化非常轻量,因为它完全是 header-only 的,无需编译安装,只需包含头文件就能用。核心在于为自定义类型提供 serialize 成员函数或友元函数,并选择合适的归档类型(如 JSONArchive、BinaryArchive 或 XMLArchive)。
cereal 不依赖外部构建系统,下载单头文件 cereal/include/cereal/cereal.hpp(或通过 vcpkg/conan 安装),然后在代码中包含即可:
#include
#include
#include
cereal 已为常见 STL 类型(std::string、std::vector、std::map 等)提供了内置支持,无需额外声明。
对你的结构体或类,只需定义一个 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));
}
};
ar(name, age, scores)
serialize 函数实现不同归档对应不同格式和用途,用法一致:
// 写入 JSON 文件
{
std::ofstream o
s("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));
}
cereal 简单但有几个关键点容易踩坑:
CEREAL_REGISTER_TYPE(启用运行时类型信息)save_minimal 或 load_and_construct 控制细节add_subdirectory 引入