前面描述的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.
...
}
原则上,这比原始实现要简单得多。完成此代码需要:
- 填写 “To Do” 部分。这需要创建一个额外的映射(map)来管理 shared_ptr 实例。
- 一种方法来区分指向相同对象的指针和指向它们基类的指针。
- 与以前方法序列化的指针的向后兼容性。这利用了序列化类版本控制。
- 正确处理 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>