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 还能没有任何问题地序列化引用。 就像指针一样,引用对象被自动地序列化。