2009-12-18 21 views
6

I QSharedPointers ve QWeakPointers bağlı nesnelerin karmaşık bir ağ bulunmaktadır. Boost.Serialization ile kaydetmek/yüklemek için basit bir yolu var mı? hepsi referans sayısı Aynı zamanda hemen zayıf işaretçileri boşaltır 1. olduğunu düşünüyorum bu yüzden paylaşılan işaretçileri hep çiğ işaretçiler inşa Bunun nedeni çalışmıyorPaylaşılan/zayıf işaretçiler nasıl serileştirilir?

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); 
     } 
    } 
} 

: Şimdiye kadar bu var. Ben sınıfları boost::shared_ptr ve boost::weak_ptr kullanmak dönüştürebilirsiniz biraz çaba ile

. Bu iyi olacak mı?

cevap

5

soru gerçekten işaretçileri seri ile elde etmek ne istiyorsun nedir? Beklenen çıktınız nedir? İşaretçilerin bellekteki bir yeri işaret ettiğine dikkat edin - birkaç tanesi bellekte aynı yere işaret edebilir.

adres çalışmaz Dizgeleştirme. Bir sonraki kaçak nesnelerin aynı yer alabilecek olacağını garanti hiçbir şekilde var, çünkü sadece, tam bellek adresini yazamıyor (başka bir program zaten yer ayırdık olabilir). Biz bir işaretçi var her yerde sivri bir nesne seri hale

alışkanlık eser:

  1. Bu bizim oluşturarak zayıf işaretçileri olsaydı biz
  2. dizi haline getirmelisiniz ediyorum çok daha fazla veri olurdu Dairesel bağımlılık, bu bağlantıyı daha sonra durduramayacak ve geri getiremeyeceğiz.

deserializing zaman

  • birine aynı nesneleri birleştirmek için bir yolu yoktur, sen boost::serialization resmi cevabı deneyebilirsiniz
  • +0

    ben 2 çözüm benim için çalışması gerektiğini düşünüyorum, teşekkür ederim. – stribika

    İlgili konular