2009-12-18 15 views
6

Mam złożoną sieć obiektów połączonych z QSharedPointers i QWeakPointers. Czy istnieje prosty sposób na zapisanie/załadowanie ich za pomocą funkcji Boost.Serialization? Do tej pory mam to:Jak serializować współdzielone/słabe wskaźniki?

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

To nie działa, ponieważ wspólne wskaźniki są zawsze wykonane z surowych wskaźników więc wszyscy myślą, hrabia odniesienia 1. Jest również natychmiast uwalnia słabe wskaźniki.

Z pewnym wysiłkiem mogę przekonwertować klasy, aby używać boost::shared_ptr i boost::weak_ptr. Czy to przyniesie coś dobrego?

Odpowiedz

5

Pytanie, co naprawdę chcesz osiągnąć przez szeregowanie wskaźników? Jakie są twoje oczekiwane wyniki? Zwróć uwagę, że wskaźniki wskazują miejsce w pamięci - kilka może wskazywać to samo miejsce w pamięci.

Serializacja adresu nie będzie działać. Nie można po prostu zapisać dokładnego adresu pamięci, ponieważ nie ma możliwości zagwarantowania, że ​​obiekty w następnym przebiegu będą mogły zająć to samo miejsce (inny program mógł już zarezerwować to miejsce).

szeregowania ostrego przedmiotu w każdym miejscu, gdzie mamy wskaźnik przyzwyczajenie praca:

  1. Byłoby to o wiele więcej danych, które musielibyśmy serializacji
  2. Gdybyśmy mieli słabe wskaźniki tworzenia zależność cykliczna, której nie moglibyśmy później zatrzymać i pobrać tego połączenia.
  3. Nie ma sposobu, aby połączyć te same obiekty w jeden podczas deserializacji

Teraz, gdy o tym myślę, można spróbować oficjalną odpowiedź boost::serialization:

+0

Myślę, że drugie rozwiązanie powinno zadziałać dla mnie, dziękuję. – stribika