• 11.5. 优化用封装函数

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