• 11.3. 指针和引用

    11.3. 指针和引用

    Boost.Serialization 还能序列化指针和引用。 由于指针存储对象的地址,序列化对象的地址没有什么意义,而是在序列化指针和引用时,对象的引用被自动地序列化。

    1. #include <boost/archive/text_oarchive.hpp>
    2. #include <boost/archive/text_iarchive.hpp>
    3. #include <iostream>
    4. #include <sstream>
    5.  
    6. std::stringstream ss;
    7.  
    8. class person
    9. {
    10. public:
    11. person()
    12. {
    13. }
    14.  
    15. person(int age)
    16. : age_(age)
    17. {
    18. }
    19.  
    20. int age() const
    21. {
    22. return age_;
    23. }
    24.  
    25. private:
    26. friend class boost::serialization::access;
    27.  
    28. template <typename Archive>
    29. void serialize(Archive &ar, const unsigned int version)
    30. {
    31. ar & age_;
    32. }
    33.  
    34. int age_;
    35. };
    36.  
    37. void save()
    38. {
    39. boost::archive::text_oarchive oa(ss);
    40. person *p = new person(31);
    41. oa << p;
    42. std::cout << std::hex << p << std::endl;
    43. delete p;
    44. }
    45.  
    46. void load()
    47. {
    48. boost::archive::text_iarchive ia(ss);
    49. person *p;
    50. ia >> p;
    51. std::cout << std::hex << p << std::endl;
    52. std::cout << p->age() << std::endl;
    53. delete p;
    54. }
    55.  
    56. int main()
    57. {
    58. save();
    59. load();
    60. }
    61.  
    • 下载源代码

    上面的应用程序创建了一个新的 person 类型的对象,使用 new 创建并赋值给指针 p 。 是指针 - 而不是 *p - 被序列化了。Boost.Serialization 自动地通过 p 的引用序列化对象本身而不是对象的地址。

    如果归档被恢复, p 不必指向相同的地址。 而是创建新对象并将它的地址赋值给 p 。 Boost.Serialization 只保证对象和之前序列化的对象相同,而不是地址相同。

    由于新式的 C++ 在动态分配内存有关的地方使用 智能指针 (smart pointers) , Boost.Serialization 对此也提供了相应的支持。

    1. #include <boost/archive/text_oarchive.hpp>
    2. #include <boost/archive/text_iarchive.hpp>
    3. #include <boost/serialization/scoped_ptr.hpp>
    4. #include <boost/scoped_ptr.hpp>
    5. #include <iostream>
    6. #include <sstream>
    7.  
    8. std::stringstream ss;
    9.  
    10. class person
    11. {
    12. public:
    13. person()
    14. {
    15. }
    16.  
    17. person(int age)
    18. : age_(age)
    19. {
    20. }
    21.  
    22. int age() const
    23. {
    24. return age_;
    25. }
    26.  
    27. private:
    28. friend class boost::serialization::access;
    29.  
    30. template <typename Archive>
    31. void serialize(Archive &ar, const unsigned int version)
    32. {
    33. ar & age_;
    34. }
    35.  
    36. int age_;
    37. };
    38.  
    39. void save()
    40. {
    41. boost::archive::text_oarchive oa(ss);
    42. boost::scoped_ptr<person> p(new person(31));
    43. oa << p;
    44. }
    45.  
    46. void load()
    47. {
    48. boost::archive::text_iarchive ia(ss);
    49. boost::scoped_ptr<person> p;
    50. ia >> p;
    51. std::cout << p->age() << std::endl;
    52. }
    53.  
    54. int main()
    55. {
    56. save();
    57. load();
    58. }
    59.  
    • 下载源代码

    例子中使用了智能指针 boost::scoped_ptr 来管理动态分配的 person 类型的对象。 为了序列化这样的指针,必须包含 boost/serialization/scoped_ptr.hpp 头文件。

    在使用 boost::shared_ptr 类型的智能指针的时候需要序列化,那么必须包含 boost/serialization/shared_ptr.hpp 头文件。

    下面的应用程序使用引用替代了指针。

    1. #include <boost/archive/text_oarchive.hpp>
    2. #include <boost/archive/text_iarchive.hpp>
    3. #include <iostream>
    4. #include <sstream>
    5.  
    6. std::stringstream ss;
    7.  
    8. class person
    9. {
    10. public:
    11. person()
    12. {
    13. }
    14.  
    15. person(int age)
    16. : age_(age)
    17. {
    18. }
    19.  
    20. int age() const
    21. {
    22. return age_;
    23. }
    24.  
    25. private:
    26. friend class boost::serialization::access;
    27.  
    28. template <typename Archive>
    29. void serialize(Archive &ar, const unsigned int version)
    30. {
    31. ar & age_;
    32. }
    33.  
    34. int age_;
    35. };
    36.  
    37. void save()
    38. {
    39. boost::archive::text_oarchive oa(ss);
    40. person p(31);
    41. person &pp = p;
    42. oa << pp;
    43. }
    44.  
    45. void load()
    46. {
    47. boost::archive::text_iarchive ia(ss);
    48. person p;
    49. person &pp = p;
    50. ia >> pp;
    51. std::cout << pp.age() << std::endl;
    52. }
    53.  
    54. int main()
    55. {
    56. save();
    57. load();
    58. }
    59.  
    • 下载源代码

    可见,Boost.Serialization 还能没有任何问题地序列化引用。 就像指针一样,引用对象被自动地序列化。