6.2 Case Studies- shared_ptr<class T>Revisited

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

  • 它依赖于 Boost 的 shared_ptr 实现:这意味着这种序列化方法在其实现中使用了 Boost 库提供的 shared_ptr 类型。因此,它的可移植性受限于 Boost 库,如果未来的 C++ 标准库或其他库采用不同的 shared_ptr 实现,这种依赖性可能导致问题。
  • shared_ptr 接口已经包括在 std::tr1 中,并有可能最终包含在标准的 C++ 库中:这是指 shared_ptr 的接口已经在 C++ 技术报告 1 (TR1) 中被引入,而 TR1 是 C++11 标准库的前身。因此,C++11 及以后的版本中,可以通过 std::tr1::shared_ptr 来访问 shared_ptr。另外,未来的 C++ 标准库版本可能会直接包含 shared_ptr,而不再需要依赖 Boost 或 TR1。
  • 它需要额外的导出宏。
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 <boost/serialization/shared_ptr_132.hpp>
#include <boost/serialization/shared_ptr.hpp>

rather than just

#include <boost/serialization/shared_ptr.hpp>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值