C++ 提升序列化按位序列化能力
我希望从is_bitwise_serializable trait可以像下面这样序列化类,而不使用serialize函数: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 我想知道,为什么需要为按位可序列化类提供序列化函数?来自文档: 一些简单的类可以通过直接复制类的所有位来序列化。对于不包含
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;
}