cereal更轻量、头文件即用,Boost功能全但需编译;核心是为类定义serialize函数并选择对应归档类型(JSON/二进制/XML)执行序列化与反序列化。
用 Boost.Serialization 或 cereal 库做 C++ 对象序列化和反序列化,核心就两点:让类支持存取逻辑 + 选对存档类型(文本/二进制/XML)。cereal 更轻量、头文件即用;Boost 功能更全但依赖编译。下面直接说怎么写、怎么用。
cereal 要求你为类提供一个 serialize 成员函数(或非成员友元),它接收一个归档对象(如 cereal::JSONOutputArchive),把成员变量按顺序传给它。Boost 同理,只是接口名略有不同。
例如:
struct Person {序列化就是把对象“写进”某种格式的归档。cereal 支持 JSON、XML、二进制;Boost 还支持宽字符和自定义流。
cereal::JSONOutputArchive ar{ofs}; ar(obj);
cereal::BinaryOutputArchive ar{ofs}; ar(obj);
boost::archive::text_oarchive ar(ofs); ar & obj;
注意:二进制归档不跨平台(字节序、类型大小需一致);JSON/XML 更通用,但体积大、稍慢。
反序列化是序列化的逆过程,用对应输入归档类型读取数据,自动填充对象字段。前提是对象已构造好(或用默认构造),且归档内容与序列化时结构完全匹配(字段名、顺序、类型)。
cereal::JSONInputArchive ar{ifs}; ar(obj);
boost::archive::text_iarchive ar(ifs); ar & obj;
若字段名不一致或新增/删减字段,cereal 可通过 CEREAL_OPTIONAL 或版本控制处理;Boost 需显式实现 save_construct_data/load_construct_data 等机制。
实际用的时候容易卡在这几处:
virtual ~Base() = default;
cereal::me
mory_input_archive 或智能指针 + 显式处理serialize
下,别漏 include;Boost 需链接 libboost_serialization
基本上就这些。选 cereal 快速上手,选 Boost 需长期维护或要深度定制。两者都不需要宏或代码生成,纯 C++ 模板搞定。