2009-12-18 11 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_ptr और boost::weak_ptr का उपयोग करने के लिए परिवर्तित कर सकता हूं। क्या यह कोई अच्छा होगा?

उत्तर

5

सवाल यह है कि आप वाकई पॉइंटर्स को क्रमबद्ध करके क्या हासिल करना चाहते हैं? आपका अपेक्षित आउटपुट क्या है? ध्यान दें कि पॉइंटर्स स्मृति में किसी स्थान पर इंगित करते हैं - कई स्मृति में एक ही स्थान पर इंगित कर सकते हैं।

पते को क्रमबद्ध करना काम नहीं करेगा। आप केवल सटीक मेमोरी एड्रेस लिख नहीं सकते हैं, क्योंकि अगली रन पर ऑब्जेक्ट्स एक ही स्थान लेने में सक्षम होंगे (दूसरा प्रोग्राम पहले ही उस स्थान को आरक्षित कर सकता है)।

जहां हम एक सूचक है प्रत्येक जगह में उठाई वस्तु Serializing अभ्यस्त काम:

  1. यह एक बहुत अधिक डेटा है कि हम
  2. क्रमानुसार करने अगर हम बनाने कमजोर संकेत था आवश्यकता होगी होगा एक परिपत्र निर्भरता हम बाद में उस कनेक्शन को रोकने और पुनर्प्राप्त करने में सक्षम नहीं होंगे।

deserializing अब आप इसके बारे में लगता है कि वहाँ एक में ही वस्तुओं विलय करने के लिए कोई रास्ता नहीं है, तो आप boost::serialization की आधिकारिक जवाब कोशिश कर सकते हैं

+0

मुझे लगता है कि दूसरा समाधान मेरे लिए काम करना चाहिए, धन्यवाद। – stribika