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.
¿se refiere a escribir 'impulsar :: shared_ptr' en lugar de' std :: shared_ptr'? – aldo
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