提升序列化按位序列化能力

Boost serialization bitwise serializability

我期望 is_bitwise_serializable 特征序列化 class 如下(没有序列化功能):

class A { int a; char b; };
BOOST_IS_BITWISE_SERIALIZABLE(A);
A a{2, 'x'};
some_archive << a; // serializes a bitwisely

我想知道,为什么bitwise_serializable class需要提供序列化功能?

来自文档:

Some simple classes could be serialized just by directly copying all bits of the class. This is, in particular, the case for POD data types containing no pointer members, and which are neither versioned nor tracked. Some archives, such as non-portable binary archives can make us of this information to substantially speed up serialization.

To indicate the possibility of bitwise serialization the type trait defined in the header file is_bitwise_serializable.hpp is used:

这里是重点:这个优化

  • 在适用的存档类型中是可选的
  • 并不适用于所有存档类型,例如

    • 无法通过复制原始内存表示来实现需要可移植的二进制存档(因为它依赖于实现和平台)

    • 文本存档可能不想对此进行优化(例如,它有不同的目标,比如"human readable XML",他们可能不想编码你的 vector<A> 作为一个大的 bas64 编码的 blob)。

请注意,这也解释了 is_bit_wise_serializable<T> 并非部分专用于具有 is_pod<T>::value == true 的任何类型(这在技术上很容易完成):

  • 一些 类 可能对序列化他们的所有状态不感兴趣(因此使用按位复制比只选择有趣的 位[=42=需要更多 space ](双关语))

您没有具体询问,但这就是工作实施的样子:

#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <sstream>

struct A { int a; char b;
    template <typename Ar> void serialize(Ar& ar, unsigned) {
        ar & a;
        ar & b;
    }
};

BOOST_IS_BITWISE_SERIALIZABLE(A)

int main() {
    std::ostringstream oss;
    boost::archive::binary_oarchive oa(oss);

    A data { 1, 'z' };
    oa << data;
}