一、说明
用于优化的包装函数:本节介绍包装函数以优化序列化过程。这些函数标记对象以允许 Boost.Serialization 应用某些优化技术。
二、示范和代码
示例 64.14。在没有包装函数的情况下序列化数组
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
text_oarchive oa{ss};
boost::array<int, 3> a{{0, 1, 2}};
oa << a;
}
void load()
{
text_iarchive ia{ss};
boost::array<int, 3> a;
ia >> a;
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
save();
load();
}
Example 64.14
示例 64.14 使用没有任何包装函数的 Boost.Serialization。该示例创建值 22 serialization::archive 11 0 0 3 0 1 2 并将其写入字符串。使用包装函数 boost::serialization::make_array(),写入的值可以缩短为以下字符串:22 serialization::archive 11 0 1 2。
示例 64.15。使用包装函数 make_array() 序列化数组
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <array>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
text_oarchive oa{ss};
std::array<int, 3> a{{0, 1, 2}};
oa << boost::serialization::make_array(a.data(), a.size());
}
void load()
{
text_iarchive ia{ss};
std::array<int, 3> a;
ia >> boost::serialization::make_array(a.data(), a.size());
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
save();
load();
}
boost::serialization::make_array ()
函数需要地址和数组的长度。 由于长度是硬编码的,所以它不需要作为 boost::array
类型的一部分序列化。
换个说法就是:boost::serialization::make_array() 需要数组的地址和长度。但是,因为它是预先知道的,所以不需要将长度序列化为数组的一部分。
任何时候,如果 boost::array
或 std::vector
包含一个可以直接序列化的数组,都可以使用这个函数。 其他一般需要序列化的属性不能被序列化。
另一个 Boost.Serialization 提供的封装函数是 boost::serialization::make_binary_object ()
。 与 boost::serialization::make_array ()
类似,它也需要地址和长度。 boost::serialization::make_binary_object ()
函数只是为了用来序列化没有底层结构的二进制数据,而 boost::serialization::make_array ()
是用来序列化数组的。
只要 std::array 或 std::vector 等类包含可以直接序列化的数组,就可以使用 boost::serialization::make_array()。跳过通常也会被序列化的其他成员变量(参见示例 64.15)。
Boost.Serialization 还提供包装器 boost::serialization::make_binary_object()。类似于 boost::serialization::make_array(),此函数需要一个地址和一个长度。 boost::serialization::make_binary_object() 仅用于没有底层结构的二进制数据,而 boost::serialization::make_array() 用于数组。