shared_ptr<class T>Revisited

前面描述的shared_ptr串行化说明了对中等复杂的类结构进行串行化的直接方法。不幸的是,这种方式有一些不可取的特点:

  • 它依赖于Boost的shared_ptr实现。shared_ptr的接口已经包含在std::tr1中,将来可能被包含在标准C++库中。只依赖于公共接口的实现可以确保在将来的任何shared_ptr实现中正常工作。
  • 它需要额外的导出宏。
template<class Archive, class T>
inline void save(
    Archive & ar,
    const boost::shared_ptr<T> &t,
    const unsigned int /* file_version */
){
    const T * t_ptr = t.get();
    // just serialize the underlying raw pointer
    ar <<: boost::serialization::make_nvp("px", t_ptr);
}

template<class Archive, class T>
inline void load(
    Archive & ar,
    boost::shared_ptr<T> &t,
    const unsigned int file_version
){
    T* r;
    // recover the underlying raw pointer
    ar >> boost::serialization::make_nvp("px", r);

    // To Do - match up with other shared pointers which 
    // use this same raw pointer.
    ...
}

原则上,这比原始实现要简单得多。完成此代码需要:

  1. 填写 “To Do” 部分。这需要创建一个额外的映射(map)来管理 shared_ptr 实例。
  2. 一种方法来区分指向相同对象的指针和指向它们基类的指针。
  3. 与以前方法序列化的指针的向后兼容性。这利用了序列化类版本控制。
  4. 正确处理 weak_ptr。

Note that if your code needs to read archives created under boost version 1.32, you will have to include the following

#include 
#include 

rather than just

#include 

你可能感兴趣的:(boost,c++)