C++浅析序列数据封装与优化实现方法
无水先生 人气:0一、说明
用于优化的包装函数:本节介绍包装函数以优化序列化过程。这些函数标记对象以允许 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(); }
示例 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() 用于数组。
加载全部内容