如何使用Boost Serialization自定义值的序列化与反序列化逻辑?
解决Boost Serialization的自定义序列化/反序列化问题及文档参考
一、实现分离的序列化与反序列化逻辑
Boost Serialization支持分裂序列化机制,通过split_member或split_free宏可以将序列化和反序列化逻辑分开实现,完美适配正反逻辑不同的场景。
1. 处理布尔值(编码为"01"/"00")
以自定义bool类型的序列化为例,使用split_member:
#include <boost/serialization/split_member.hpp> namespace boost { namespace serialization { template<class Archive> void save(Archive& ar, const bool& b, const unsigned int version) { // 序列化:bool转"01"/"00"字符数组 unsigned char buf[2] = {b ? '0' : '0', b ? '1' : '0'}; ar.write(buf, 2); } template<class Archive> void load(Archive& ar, bool& b, const unsigned int version) { // 反序列化:读两个字符转bool unsigned char buf[2]; ar.read(buf, 2); b = (buf[0] == '0' && buf[1] == '1'); } template<class Archive> void serialize(Archive& ar, bool& b, const unsigned int version) { boost::serialization::split_member(ar, b, version); } } // namespace serialization } // namespace boost
2. 处理整数(自定义字符数组编码)
利用你已实现的intToChars和charsToInt函数,用分裂机制实现:
#include <boost/serialization/split_member.hpp> // 包装类用于区分普通整数和需要特殊编码的整数 template<size_t arraySize, unsigned int base> struct EncodedInt { unsigned int value; EncodedInt(unsigned int v = 0) : value(v) {} }; namespace boost { namespace serialization { template<class Archive, size_t arraySize, unsigned int base> void save(Archive& ar, const EncodedInt<arraySize, base>& data, const unsigned int version) { auto char_array = intToChars<arraySize, base>(data.value); ar.write(char_array.data(), arraySize); } template<class Archive, size_t arraySize, unsigned int base> void load(Archive& ar, EncodedInt<arraySize, base>& data, const unsigned int version) { std::array<unsigned char, arraySize> char_array; ar.read(char_array.data(), arraySize); data.value = charsToInt<arraySize, base>(char_array); } template<class Archive, size_t arraySize, unsigned int base> void serialize(Archive& ar, EncodedInt<arraySize, base>& data, const unsigned int version) { boost::serialization::split_member(ar, data, version); } } // namespace serialization } // namespace boost
使用时直接用EncodedInt<N, BASE>替代原始unsigned int即可。
3. 处理二进制对象
直接使用Boost的binary_object序列化原始二进制数据:
#include <boost/serialization/binary_object.hpp> #include <vector> struct RawBinary { std::vector<unsigned char> data; template<class Archive> void serialize(Archive& ar, const unsigned int version) { ar << boost::serialization::make_binary_object(data.data(), data.size()); } };
反序列化时会自动按二进制格式读取,无需额外转换逻辑。
二、Boost Serialization文档参考
目前Boost官方没有完整的中文官方文档,你找到的1.34.0版本过于陈旧(当前Boost稳定版为1.85.x),内容已大幅更新。建议直接参考官方最新英文文档,可借助翻译工具完成中文转换,重点关注:
- 分裂序列化(Split Serialization)章节
- 自定义类型序列化(Custom Serialization)章节
- 二进制归档(Binary Archives)相关内容
内容的提问来源于stack exchange,提问作者Typhaon
相关产品推荐
相关产品推荐

