2009-12-18 95 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