6

我有一个与 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);
        }
    }
}

这是行不通的,因为共享指针总是从原始指针构造的,所以他们都认为引用计数是 1。它还立即释放弱指针。

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

4

1 回答 1

5

问题是你真正想通过序列化指针来实现什么?你的预期输出是什么?请注意,指针指向内存中的一个位置——多个指针可能指向内存中的同一个位置。

序列化地址将不起作用。您不能只写下确切的内存地址,因为无法保证下一次运行的对象将能够占用相同的空间(另一个程序可能已经保留了该位置)。

在每个我们有指针的地方序列化指向的对象是行不通的:

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

既然你想了,你可以试试官方的回答boost::serialization

于 2009-12-18T17:26:56.137 回答