11.3. 指针和引用
Boost.Serialization 还能序列化指针和引用。 由于指针存储对象的地址,序列化对象的地址没有什么意义,而是在序列化指针和引用时,对象的引用被自动地序列化。
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <iostream>
- #include <sstream>
- std::stringstream ss;
- class person
- {
- public:
- person()
- {
- }
- person(int age)
- : age_(age)
- {
- }
- int age() const
- {
- return age_;
- }
- private:
- friend class boost::serialization::access;
- template <typename Archive>
- void serialize(Archive &ar, const unsigned int version)
- {
- ar & age_;
- }
- int age_;
- };
- void save()
- {
- boost::archive::text_oarchive oa(ss);
- person *p = new person(31);
- oa << p;
- std::cout << std::hex << p << std::endl;
- delete p;
- }
- void load()
- {
- boost::archive::text_iarchive ia(ss);
- person *p;
- ia >> p;
- std::cout << std::hex << p << std::endl;
- std::cout << p->age() << std::endl;
- delete p;
- }
- int main()
- {
- save();
- load();
- }
上面的应用程序创建了一个新的 person
类型的对象,使用 new
创建并赋值给指针 p 。 是指针 - 而不是 *p
- 被序列化了。Boost.Serialization 自动地通过 p 的引用序列化对象本身而不是对象的地址。
如果归档被恢复, p 不必指向相同的地址。 而是创建新对象并将它的地址赋值给 p 。 Boost.Serialization 只保证对象和之前序列化的对象相同,而不是地址相同。
由于新式的 C++ 在动态分配内存有关的地方使用 智能指针 (smart pointers) , Boost.Serialization 对此也提供了相应的支持。
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <boost/serialization/scoped_ptr.hpp>
- #include <boost/scoped_ptr.hpp>
- #include <iostream>
- #include <sstream>
- std::stringstream ss;
- class person
- {
- public:
- person()
- {
- }
- person(int age)
- : age_(age)
- {
- }
- int age() const
- {
- return age_;
- }
- private:
- friend class boost::serialization::access;
- template <typename Archive>
- void serialize(Archive &ar, const unsigned int version)
- {
- ar & age_;
- }
- int age_;
- };
- void save()
- {
- boost::archive::text_oarchive oa(ss);
- boost::scoped_ptr<person> p(new person(31));
- oa << p;
- }
- void load()
- {
- boost::archive::text_iarchive ia(ss);
- boost::scoped_ptr<person> p;
- ia >> p;
- std::cout << p->age() << std::endl;
- }
- int main()
- {
- save();
- load();
- }
例子中使用了智能指针 boost::scoped_ptr
来管理动态分配的 person
类型的对象。 为了序列化这样的指针,必须包含 boost/serialization/scoped_ptr.hpp
头文件。
在使用 boost::shared_ptr
类型的智能指针的时候需要序列化,那么必须包含 boost/serialization/shared_ptr.hpp
头文件。
下面的应用程序使用引用替代了指针。
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <iostream>
- #include <sstream>
- std::stringstream ss;
- class person
- {
- public:
- person()
- {
- }
- person(int age)
- : age_(age)
- {
- }
- int age() const
- {
- return age_;
- }
- private:
- friend class boost::serialization::access;
- template <typename Archive>
- void serialize(Archive &ar, const unsigned int version)
- {
- ar & age_;
- }
- int age_;
- };
- void save()
- {
- boost::archive::text_oarchive oa(ss);
- person p(31);
- person &pp = p;
- oa << pp;
- }
- void load()
- {
- boost::archive::text_iarchive ia(ss);
- person p;
- person &pp = p;
- ia >> pp;
- std::cout << pp.age() << std::endl;
- }
- int main()
- {
- save();
- load();
- }
可见,Boost.Serialization 还能没有任何问题地序列化引用。 就像指针一样,引用对象被自动地序列化。