2010-01-24 13 views
8

¿Hay algo similar a la serialización Java/.NET para C++?¿Es posible serializar automáticamente un objeto C++?

+2

No porque C++ no tiene reflejo de tiempo de ejecución. Ver esta respuesta para una buena alternativa. –

+2

Duplicado de http://stackoverflow.com/questions/1810372/c-serialization-library-that-supports-partial-serialization y http://stackoverflow.com/questions/1809670/how-to-implement-serialization-in -c y http://stackoverflow.com/questions/234724/how-to-serialize-in-c y muchos otros encontrados con la desalentadora y complicada búsqueda http://stackoverflow.com/search?q=c%2B% 2B + serialización + biblioteca – dmckee

Respuesta

12

Boost contiene un serialization library. No lo he usado yo mismo, pero generalmente las bibliotecas de refuerzo funcionan bastante bien.

+6

mientras responde la pregunta en el cuerpo, no dirigió la pregunta en el título, que es la más interesante –

+0

La respuesta a la pregunta en el título es: No, C++ no se inicia automáticamente serializa tus objetos. – sth

6

Lamentablemente, no existe una forma automática de serializar objetos en C++. Esto se debe a que cualquier motor de serialización debe ser capaz de "entender" su objeto personalizado en el tiempo de ejecución y C++ no contiene la información necesaria para eso. Java y .Net en el otro lado tienen, lo que se llama, Reflexión. Este mecanismo permite a cualquier persona navegar por la estructura de datos de cualquier objeto arbitrario en el tiempo de ejecución.

Todo esto no significa que no hay forma de serializar un objeto C++ con un esfuerzo relativamente pequeño. Tomemos como ejemplo la biblioteca estándar de flujos de C++. Al escribir

int x = 2010; 
cout << x << endl; 

realmente serializar un objeto de tipo int. Es posible ampliar este mecanismo para que sea compatible con su clase personalizada también. Esto se hace simplemente al sobrecargar al operador < <. No es tan agradable como la serialización de Java, pero también es muy conveniente.

También hay algunas bibliotecas que lo hacen aún más simple. Como alguien ya lo mencionó, boost serialization library hace un buen trabajo. Trabajar con la serialización de impulso parece muy similar al trabajo con iostream, pero resuelve algunos problemas inherentes a las transmisiones estándar.

3

protocol buffers de Google proporciona una implementación de C++ en el paquete central; como una buena ventaja, puede compartir esta información con lots of other languages, pero se limitará a utilizar los tipos generados en lugar del suyo (que admiten algunos motores de serialización en otros idiomas).

En realidad, esto no es un problema, ya que (si es necesario) simplemente puede tratar los tipos generados como un DTO que se empareja con sus objetos de dominio reales.

3

Boost.Serialization es una biblioteca muy buena y también es compatible con el control de versiones básico, algo que nunca es posible con la serialización automática. Debido a que casualmente necesitaba un mejor control de versiones, escribí mi propia biblioteca de serialización que sigue el estilo Boost.Serialization (porque el autor de Boost.Serialization no estaba interesado en mejorarlo).

Observe que también puede abusar de las funciones de serialización para otros fines, como la GUI o la generación de formularios web, si se agrega un poco de datos auxiliares (vea cómo Boost.Serialization hace XML).

Se debe tener en cuenta que el popular método de guardar estructuras completas (al convertirlas a caracteres * y escribir tamaño de (struct) bytes) es completamente imposible de usar, no admite versiones y se rompe si la estructura contiene alguna punteros o objetos C++ (no POD).

1

Con mucho trabajo manual (en realidad, implementando su propio RTTI intrusivo o no intrusivo) se puede lograr un nivel de automatización comparable con C#/Java.

Consulte la información detallada aquí:

How to implement serialization in C++

1

he utilizado con éxito esta:

http://uscilab.github.io/cereal/

y funcionó bien para mí en ambos iOS y Android. Es una biblioteca de solo encabezado y no tiene dependencias externas por lo que es extremadamente conveniente de usar. Lo preferí sobre el impulso porque no quería importar todas las dependencias de impulso. La biblioteca es pequeña y admite formatos de serialización XML, JSON, binarios y personalizados.

La biblioteca (como boost) requiere que se escriba explícitamente algún código de serialización y deserialización para las clases base, mientras que las colecciones se manejan automáticamente.

Cuestiones relacionadas