2009-12-18 173 views
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。这会有什么好处吗?

回答

5

问题是你真的想通过序列化指针来实现什么?你的预期产出是多少?请注意,指针指向内存中的某个位置 - 有些指针可能指向内存中的相同位置。

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

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

  1. 这将是我们需要序列化
  2. 如果我们有微弱的三分球创造了更多的数据一个循环依赖我们将无法停止并在稍后检索该连接。
  3. 反序列化

当现在你想想看有没有办法相同的对象合并成一个,你可以尝试的boost::serialization,官方的回答:

+0

我认为第二个解决方案应该为我工作,谢谢。 – stribika 2009-12-18 23:46:25