代码之家  ›  专栏  ›  技术社区  ›  stribika

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

  •  6
  • stribika  · 技术社区  · 15 年前

    我有一个复杂的对象网络,与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_ptr boost::weak_ptr .那有什么好处吗?

    1 回复  |  直到 15 年前
        1
  •  5
  •   Kornel Kisielewicz    15 年前

    问题是,您真正希望通过序列化指针来实现什么?你的预期产量是多少?注意,指针指向内存中的一个位置——几个指针可能指向内存中的同一个位置。

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

    在每个有指针的地方序列化被指向的对象 习惯于 工作:

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

    现在你想一想,你可以试试官方的答案 boost::serialization :