You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:05:34