Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提升序列化按位序列化能力_C++_Serialization_Boost - Fatal编程技术网

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

C++ 提升序列化按位序列化能力,c++,serialization,boost,C++,Serialization,Boost,我希望从is_bitwise_serializable trait可以像下面这样序列化类,而不使用serialize函数: class A { int a; char b; }; BOOST_IS_BITWISE_SERIALIZABLE(A); A a{2, 'x'}; some_archive << a; // serializes a bitwisely 我想知道,为什么需要为按位可序列化类提供序列化函数?来自文档: 一些简单的类可以通过直接复制类的所有位来序列化。对于不包含

我希望从is_bitwise_serializable trait可以像下面这样序列化类,而不使用serialize函数:

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

我想知道,为什么需要为按位可序列化类提供序列化函数?

来自文档:

一些简单的类可以通过直接复制类的所有位来序列化。对于不包含指针成员、既不进行版本控制也不进行跟踪的POD数据类型,情况尤其如此。一些档案,例如不可移植的二进制档案,可以使我们充分利用这些信息,从而大大加快序列化速度

为指示按位序列化的可能性,使用头文件中定义的类型特征为_bitwise_serializable.hpp:

以下是关键点:此优化

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

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

文本存档可能不希望对此进行优化,例如,它有不同的目标,例如,与人类可读的XML一样,他们可能不希望将向量编码为大型bas64编码blob

请注意,这也解释了is_bit_wise_serializable对于任何具有is_pod::value==true的类型都不是部分专用的这在技术上很容易做到:

有些类可能对序列化它们的所有状态不感兴趣,因此使用按位复制比只选择有趣的位要占用更多的空间 具体来说,您没有问,但这是工作实现的样子:

#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;
}