2009-12-18 6 views
6

Tengo una compleja red de objetos conectados con QSharedPointers y QWeakPointers. ¿Hay una manera simple de guardar/cargarlos con Boost.Serialization? Hasta ahora tengo esto:¿Cómo serializar punteros compartidos/débiles?

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

Esto no está funcionando debido a que los punteros compartidos siempre se construyen a partir punteros primas por lo que todos piensan que la cuenta de referencia es 1. También libera inmediatamente punteros débiles.

Con un poco de esfuerzo puedo convertir las clases para usar boost::shared_ptr y boost::weak_ptr. ¿Eso servirá de algo?

Respuesta

5

La pregunta es, ¿qué es lo que realmente quiere lograr al serializar los punteros? ¿Cuál es tu salida esperada? Tenga en cuenta que los punteros apuntan a un lugar en la memoria: varios pueden señalar el mismo lugar en la memoria.

La serialización de la dirección no funcionará. No puede simplemente anotar la dirección de memoria exacta, porque no hay forma de garantizar que los objetos en la siguiente ejecución puedan ocupar el mismo espacio (es posible que otro programa ya haya reservado ese lugar).

de números de serie del objeto con punta en cada lugar en el que tenemos un puntero costumbre trabajo:

  1. Esto sería mucho más datos que tendríamos que serializar
  2. Si tuviéramos punteros débiles creación una dependencia circular que no podríamos detener y recuperar esa conexión más tarde.
  3. No hay manera de combinar los mismos objetos en uno al deserializar

Ahora que se piensa en ello, puede probar la respuesta oficial de boost::serialization:

+0

Creo que la segunda solución debería funcionar para mí, gracias. – stribika