cereal需显式包含头文件才能使用JSON或二进制归档,serialize函数必须为非const模板函数且参数为Archive&,字段名与JSON key须完全一致,二进制归档无跨平台保证。

如何用 cereal 库做 JSON 和二进制序列化
cereal 默认不带任何序列化后端,必须显式包含对应头文件才能用 JSONOutputArchive 或 BinaryOutputArchive。没加头文件就编译报错,不是库没装好,是漏了这步。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- JSON 序列化需
#include <cereal/archives/json.hpp>;二进制用#include <cereal/archives/binary.hpp> - 两个 archive 类型不能混用:同一个
serialize函数里不能既往JSONOutputArchive写又往BinaryOutputArchive写 - JSON 归档默认不缩进、无换行,要可读格式得传入
cereal::JSONOutputArchive::Options::Indent - 二进制归档不可读、无跨平台保证(不同架构/编译器可能不兼容),别拿它存长期配置或跨进程交换数据
cereal::serialize 成员函数怎么写才不出错
最常见错误是把 serialize 声明成 const 成员函数,或漏掉 const 引用参数 —— cereal 要求 archive 参数必须是 Archive&(非常量左值引用),且函数本身不能是 const。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 正确签名只有一种:
template <class Archive> void serialize(Archive& ar),不能加const,也不能返回值 - 成员变量必须逐个传给
ar,顺序要和反序列化时完全一致;字段名在 JSON 中会变成 key,但二进制中只靠顺序匹配 - 如果类有基类,记得在
serialize里调用ar(cereal::base_class<Base>(this)),否则基类字段不参与序列化 - STL 容器(如
std::vector、std::map)直接传给ar即可,cereal 已内置支持,不用自己展开
从 JSON 文件反序列化时读不到字段?检查这三个点
典型现象是反序列化后对象字段全为零值或空字符串,但 JSON 文件明明有内容。问题往往不在解析逻辑,而在 JSON 结构和 C++ 字段名不一致、类型不匹配或 archive 构造方式不对。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- JSON 的 key 名必须和 C++ 成员变量名**完全一致**(区分大小写),cereal 不做自动映射或驼峰转换
- 确保 JSON 文件编码是 UTF-8,且无 BOM;Windows 记事本保存的 UTF-8 带 BOM 会导致
JSONInputArchive构造失败,报错类似rapidjson::kParseErrorInvalidValue - 反序列化必须用
JSONInputArchive(不是JSONOutputArchive),且构造时传入std::ifstream的rdbuf(),不能直接传文件流对象 - 示例正确用法:
std::ifstream is("data.json"); cereal::JSONInputArchive ar(is); ar(obj);
二进制序列化为什么在不同机器上读不出来
cereal 的 BinaryOutputArchive / BinaryInputArchive 是内存镜像式序列化,不处理字节序、对齐、类型尺寸差异。同一份二进制数据,在 x86_64 Linux 上序列化,放到 ARM macOS 上反序列化大概率崩溃或读错。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 二进制归档只适合单机、同编译环境下的临时缓存(比如游戏存档本地保存),别用于网络传输或跨平台持久化
- 若必须跨平台,改用
PortableBinaryArchive(需#include <cereal/archives/portable_binary.hpp>),它会标准化整数长度和字节序,但性能略低、体积略大 - 所有被序列化的类型必须是 trivially copyable(例如不能含虚函数、非 POD 成员、自定义析构函数),否则运行时可能静默出错
最容易被忽略的是:cereal 所有 archive 类都是 header-only,但依赖 rapidjson(JSON)或自身实现(binary),链接时不会报错,错误全在运行时或模板实例化阶段爆发。写完 serialize 函数后,至少用一个 archive 类型实例化一次,才能暴露大部分问题。



















