2012-03-30 10 views
9

Tengo un objeto que el siguiente campo:impulso serializar y std :: shared_ptr

boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_; 

me gustaría serializarlo, pero parece std :: shared_ptr no puede ser serializado de una manera sencilla

¿Alguien tiene una solución?

+0

¿se refiere a escribir 'impulsar :: shared_ptr' en lugar de' std :: shared_ptr'? – aldo

+0

sí, me gustaría utilizar std :: shared_ptr, pero con boost :: shared_ptr y #include correcto todo está bien, así que me quedaré con impulso, gracias por su comentario. – Guillaume07

Respuesta

11

sospecho que se echa en falta un include,

#include <boost/serialization/shared_ptr.hpp> 

link, at the bottom

Además, el ejemplo hace que se vea como aliasing y los ciclos son atendidos por defecto.

_Of supuesto, tener ciclos dará lugar a posibles pérdidas de memoria con shared_ptr que no tienen nada que ver con la serialización, y usted todavía tiene que prestar atención a las personas (por ciclos o evitando el uso juicioso de weak_ptr) _

Ver también:

+0

muy buena intuición – Guillaume07

-5

Desafortunadamente, la respuesta es que no hay una forma simple de serializar nada con punteros, porque la disposición de la memoria de los datos es diferente cuando la carga de nuevo. Un serializador capaz de manejar punteros necesitaría ser muy inteligente, y proponer un 'diseño de memoria' para guardar en un disco que tuviera direcciones de puntero válidas para la estructura almacenada, y que luego las reescribiera a medida que la estructura se deserializaba para que los punteros señalaran los lugares correctos después de la carga se completa.

La parte realmente divertida es que si permite punteros en estructuras serializables, debe poder hacer frente a los gráficos de referencia cíclicos. Además, shared_ptr mantiene los recuentos de referencia internos y la información de contabilidad para que sepa cuándo destruir un objeto, por lo que el serializador también debería saber todo acerca de cómo funciona eso, para registrar correctamente los recuentos de referencia (e ignorar las referencias de los objetos shared_ptr que no están dentro del árbol serializado, pero señalan los pensamientos dentro de él).

Básicamente es un gran dolor de cabeza, y es por eso que las bibliotecas de serialización no lo hacen de forma predeterminada. Por lo general, terminas necesitando un comportamiento personalizado bastante específico si quieres hacerlo, por lo que te dejan implementarlo para asegurarte de que se realice correctamente.

+1

Ahora, ¿está sugiriendo que Boost Serialization no puede hacer frente a las complejidades que menciona? Estoy bastante seguro de que puede. Vea la demostración del tutorial: http://www.boost.org/doc/libs/1_49_0/libs/serialization/example/demo.cpp – sehe

+0

Nada en ese ejemplo serializa nada con punteros en él salvo para contenedores STL (que por supuesto usan ellos internall), que señala explícitamente que ya tienen soporte específico en la biblioteca de serialización. Sin embargo, ese ejemplo muestra cómo proporcionar el comportamiento de serialización para sus propios tipos, que es el enlace que usa para serializar todo lo que la biblioteca no puede manejar con su conocimiento predeterminado. –

+0

'std :: list > ​​schedule;' y 'typedef bus_stop * bus_stop_pointer; std :: list stops; '- y ** sí ** las paradas de autobús se comparten entre rutas. Me pregunto en qué enlace _ha hecho clic? – sehe

Cuestiones relacionadas