如何序列化共享/弱指针?

str*_*ika 6 c++ boost pointers qt4 boost-serialization

我有一个复杂的对象网络连接QSharedPointers和QWeakPointers.有没有一种简单的方法来使用Boost.Serialization保存/加载它们?到目前为止我有这个:

namespace boost {
    namespace serialization {
        template<class Archive, class T>
        void save(Archive& ar, QSharedPointer<T> const& ptr, unsigned version) {
            T* sharedPointer = ptr.data();
            ar & BOOST_SERIALIZATION_NVP(sharedPointer);
        }

        template<class Archive, class T>
        void load(Archive& ar, QSharedPointer<T>& ptr, unsigned version) {
            T* sharedPointer = 0;
            ar & BOOST_SERIALIZATION_NVP(sharedPointer);
            ptr = QSharedPointer<T>(sharedPointer);
        }

        template<class Archive, class T>
        void save(Archive& ar, QWeakPointer<T> const& ptr, unsigned version) {
            T* weakPointer = ptr.toStrongRef().data();
            ar & BOOST_SERIALIZATION_NVP(weakPointer);
        }

        template<class Archive, class T>
        void load(Archive& ar, QWeakPointer<T>& ptr, unsigned version) {
            T* weakPointer = 0;
            ar & BOOST_SERIALIZATION_NVP(weakPointer);
            ptr = QSharedPointer<T>(weakPointer);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为共享指针总是由原始指针构成,因此它们都认为引用计数为1.它还会立即释放弱指针.

通过一些努力,我可以将类转换为使用boost::shared_ptrboost::weak_ptr.那会有什么好处吗?

Kor*_*icz 5

问题是你通过序列化指针真正想要实现什么?你的预期产量是多少?请注意,指针指向内存中的一个位置 - 有几个可能指向内存中的相同位置.

序列化地址将不起作用.你不能只记下确切的内存地址,因为没有办法保证下次运行的对象能够占用相同的空间(另一个程序可能已经预留了那个地方).

序列化尖锐的物体在那里我们有一个指针每个地方不会工作:

  1. 这将是我们需要序列化的更多数据
  2. 如果我们有弱指针创建循环依赖,我们将无法在以后停止并检索该连接.
  3. 反序列化时无法将相同的对象合并为一个

现在您考虑一下,您可以尝试以下官方答案boost::serialization: