11.5. 优化用封装函数

在理解了如何序列化对象之后,本节介绍用来优化序列化过程的封装函数。 通过这个函数,对象被打上标记允许 Boost.Serialization 使用一些优化技术。

下面例子使用不带封装函数的 Boost.Serialization 。

  1. #include <boost/archive/text_oarchive.hpp>
  2. #include <boost/archive/text_iarchive.hpp>
  3. #include <boost/array.hpp>
  4. #include <iostream>
  5. #include <sstream>
  6.  
  7. std::stringstream ss;
  8.  
  9. void save()
  10. {
  11. boost::archive::text_oarchive oa(ss);
  12. boost::array<int, 3> a = { 0, 1, 2 };
  13. oa << a;
  14. }
  15.  
  16. void load()
  17. {
  18. boost::archive::text_iarchive ia(ss);
  19. boost::array<int, 3> a;
  20. ia >> a;
  21. std::cout << a[0] << ", " << a[1] << ", " << a[2] << std::endl;
  22. }
  23.  
  24. int main()
  25. {
  26. save();
  27. load();
  28. }
  29.  

上面的应用程序创建一个文本流 22 serialization::archive 5 0 0 3 0 1 2 并将其写到标准输出流中。 使用封装函数 boost::serialization::make_array () ,输出可以缩短到 22 serialization::archive 5 0 1 2

  1. #include <boost/archive/text_oarchive.hpp>
  2. #include <boost/archive/text_iarchive.hpp>
  3. #include <boost/serialization/array.hpp>
  4. #include <boost/array.hpp>
  5. #include <iostream>
  6. #include <sstream>
  7.  
  8. std::stringstream ss;
  9.  
  10. void save()
  11. {
  12. boost::archive::text_oarchive oa(ss);
  13. boost::array<int, 3> a = { 0, 1, 2 };
  14. oa << boost::serialization::make_array(a.data(), a.size());
  15. }
  16.  
  17. void load()
  18. {
  19. boost::archive::text_iarchive ia(ss);
  20. boost::array<int, 3> a;
  21. ia >> boost::serialization::make_array(a.data(), a.size());
  22. std::cout << a[0] << ", " << a[1] << ", " << a[2] << std::endl;
  23. }
  24.  
  25. int main()
  26. {
  27. save();
  28. load();
  29. }
  30.  

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 () 是用来序列化数组的。