2

在 boost教程和使用共享指针的示例中,他们有一个类 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 */); 

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

4

2 回答 2

0

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

在我看来,这是使用共享指针的错误理由。使用共享指针很好,但原因是它为你做内存管理,这样你就不用delete自己调用了。在某些(极少数)情况下,使用智能指针可能不是最佳解决方案,您更愿意自己进行内存管理。这是决定是否使用智能指针的最重要标准,紧随其后的是序列化作为附带好处/麻烦。

反正:

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

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

BOOST_SERIALIZATION_SHARED_PTR(A)

另外,我猜它自动与A*对象一起工作的原因是这些对象有一个默认实现。

于 2013-07-17T18:56:15.853 回答
0

在Boost 文档中有一个很好的答案。

这是他们给出的例子:

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 文档中。

于 2013-07-18T04:53:23.130 回答