11.5. 优化用封装函数
在理解了如何序列化对象之后,本节介绍用来优化序列化过程的封装函数。 通过这个函数,对象被打上标记允许 Boost.Serialization 使用一些优化技术。
下面例子使用不带封装函数的 Boost.Serialization 。
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <boost/array.hpp>
- #include <iostream>
- #include <sstream>
- std::stringstream ss;
- void save()
- {
- boost::archive::text_oarchive oa(ss);
- boost::array<int, 3> a = { 0, 1, 2 };
- oa << a;
- }
- void load()
- {
- boost::archive::text_iarchive ia(ss);
- boost::array<int, 3> a;
- ia >> a;
- std::cout << a[0] << ", " << a[1] << ", " << a[2] << std::endl;
- }
- int main()
- {
- save();
- load();
- }
上面的应用程序创建一个文本流 22 serialization::archive 5 0 0 3 0 1 2
并将其写到标准输出流中。 使用封装函数 boost::serialization::make_array ()
,输出可以缩短到 22 serialization::archive 5 0 1 2
。
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <boost/serialization/array.hpp>
- #include <boost/array.hpp>
- #include <iostream>
- #include <sstream>
- std::stringstream ss;
- void save()
- {
- boost::archive::text_oarchive oa(ss);
- boost::array<int, 3> a = { 0, 1, 2 };
- oa << boost::serialization::make_array(a.data(), a.size());
- }
- void load()
- {
- boost::archive::text_iarchive ia(ss);
- boost::array<int, 3> a;
- ia >> boost::serialization::make_array(a.data(), a.size());
- std::cout << a[0] << ", " << a[1] << ", " << a[2] << std::endl;
- }
- int main()
- {
- save();
- load();
- }
boost::serialization::make_array ()
函数需要地址和数组的长度。 由于长度是硬编码的,所以它不需要作为 boost::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 ()
是用来序列化数组的。