使用shared_ptr增强序列化,而不在尖类中实现serialize()函数

时间:2013-07-17 17:25:51

标签: c++ serialization boost shared-ptr

在使用共享指针的boost tutorial and example中,它们有一个A类,它们创建一个指向类A对象的共享指针:

boost::shared_ptr<A> spa(new A);

然后他们将其序列化:

std::ofstream ofs(filename.c_str());
boost::archive::text_oarchive oa(ofs);
oa << spa;

那么为什么课程A必须有这个功能?

void serialize(Archive & ar, const unsigned int /* file_version */); 

我想使用共享指针的原因是为了避免为我的一些复杂类定义这个函数。目前我没有使用共享指针,我正在使用真正的指针,而我实际上是在序列化指针指向的地址。

2 个答案:

答案 0 :(得分:0)

  

我想使用shared_pointer的原因是为了避免为我的一些复杂类定义这个函数。

在我看来,这是使用共享指针的错误原因。使用共享指针 是好的,但原因是它为您进行内存管理,因此您不必自己调用delete。在某些(罕见)情况下,使用智能指针可能不是最佳解决方案,您更愿意自己进行内存管理。这是决定使用智能指针的最重要标准,序列化是一个附带好处/麻烦之后。

<强>反正:

我不是boost::archive框架的专家,但似乎序列化到类Archive比打印值更微妙,因为它也使用“版本”以防万一更改序列化对象的方式,但要确保与使用旧版本编写的文件的复古兼容性。这就是为什么只使用对象的operator<<(在您的情况下,A*shared_ptr<A>)是不够的。您确实需要方法void serialize(...)

但是,boost提供了一个方便的宏来自动为shared_ptr<A>个对象定义此方法:

BOOST_SERIALIZATION_SHARED_PTR(A)

另外,我猜它与A*对象自动运行的原因是这些对象有默认实现。

答案 1 :(得分:0)

Boost documentation中有一个很好的答案。

以下是他们给出的例子:

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.
    ...
}

完整的答案在Boost文档中。