2010-11-10 15 views
11

¿Alguien sabe de una instalación de "nivel de idioma" para decapado en C++? No quiero algo como la serialización de Boost, o los Buffers de Protocolo de Google. En cambio, algo que podría serializar automáticamente a todos los miembros de una clase (con la opción de excluir algunos miembros, ya sea porque no son serializables, o bien porque no me importa guardarlos para más adelante). Esto podría lograrse con una acción adicional en el tiempo de análisis, que generaría código para manejar la serialización automática. ¿Alguien ha oído hablar de algo así?Decapado de estilo Python para C++?

Respuesta

7

No creo que haya ninguna forma de hacer esto en un lenguaje sin capacidades de introspección en tiempo de ejecución.

+0

Como dice Jacob a continuación, me preguntaba si alguien había visto una herramienta en tiempo de compilación que podría resolver este problema. Supongo que no hay nada como eso por ahí. –

+0

@RoniChoudhury A menos que me equivoque, la serialización de Boost hace un buen trabajo debido a las limitaciones del lenguaje. – Marcin

+0

@Marcin - Boost.Serialize realmente hace un buen trabajo, pero tiene que escribir una función 'serialize()' que conoce los detalles del objeto que desea serializar. – Ferruccio

1

Existe la serialización estándar de C++ con los operadores < < y >>, aunque tendrá que implementarlos para cada una de sus clases (lo que parece que no desea hacer). Algunos practicantes dicen que siempre debes implementar estos operadores, aunque por supuesto, la mayoría de nosotros rara vez lo hacemos.

3

quizás xml Enlace de datos? gsoap es solo una de las muchas opciones. Puede generar automáticamente código para la asignación entre la estructura de datos y el esquema xml. No estoy seguro de que configurar esto sea más fácil que otras opciones que mencione

0

Una manera rápida de hacer esto que conseguí trabajando una vez cuando necesitaba guardar una estructura en un archivo era lanzar mi estructura a una matriz char y escribir a un archivo. Luego, cuando quería volver a cargar mi estructura, leía todo el archivo (en modo binario) y lo convertía en el tipo de mi estructura. Lo suficientemente fácil y explota el hecho de que las estructuras se almacenan como un bloque contiguo en la memoria. Sin embargo, no esperaría que esto funcione con estructuras de datos intrincadas o indicadores, sino algo para pensar.

+2

Esta es una estrategia de serialización antigua y extremadamente pobre que fallará espectacularmente bajo cualquier cantidad de condiciones, tales como: Diferentes indicadores de compilación, diferentes versiones de compiladores, diferentes CPU (¡ni siquiera arquitecturas necesariamente diferentes!), Diferentes sistemas operativos ... –

3

algo que automáticamente podría serializar todos los miembros de una clase

Esto no es posible en C++. Python, C#, Java et al. use introspección en tiempo de ejecución para lograr esto. No se puede hacer eso en C++, RTTI no es lo suficientemente potente.

En esencia, no hay nada en el lenguaje C++ que permita a alguien descubrir las variables miembro de un objeto en tiempo de ejecución. Sin eso, no puedes serializarlos automáticamente.

Cuestiones relacionadas