¿Es posible serializar y deserializar una clase en C ++?
He estado usando Java durante 3 años, y la serialización / deserialización es bastante trivial en ese lenguaje. ¿C ++ tiene características similares? ¿Hay bibliotecas nativas que manejan la serialización?
Un ejemplo sería útil.
c++
serialization
Agusti-N
fuente
fuente
Respuestas:
La
Boost::serialization
biblioteca maneja esto con bastante elegancia. Lo he usado en varios proyectos. Hay un programa de ejemplo, que muestra cómo usarlo, aquí .La única forma nativa de hacerlo es usar secuencias. Eso es esencialmente todo lo
Boost::serialization
que hace la biblioteca, extiende el método de flujo configurando un marco para escribir objetos en un formato similar al texto y leerlos desde el mismo formato.Para los tipos integrados, o sus propios tipos con
operator<<
yoperator>>
adecuadamente definidos, eso es bastante simple; Consulte las preguntas frecuentes de C ++ para obtener más información.fuente
Me doy cuenta de que esta es una publicación antigua, pero es una de las primeras que aparece al buscar
c++ serialization
.Recomiendo a cualquiera que tenga acceso a C ++ 11 que eche un vistazo a cereal , una biblioteca de encabezado de C ++ 11 solo para serialización que admite binarios, JSON y XML listos para usar. cereal fue diseñado para ser fácil de extender y usar y tiene una sintaxis similar a Boost.
fuente
Boost es una buena sugerencia. Pero si desea rodar el suyo, no es tan difícil.
Básicamente, solo necesita una forma de construir un gráfico de objetos y luego enviarlos a un formato de almacenamiento estructurado (JSON, XML, YAML, lo que sea). Construir el gráfico es tan simple como utilizar un algoritmo recursivo de marcado de objetos decentes y luego generar todos los objetos marcados.
Escribí un artículo que describe un sistema de serialización rudimentario (pero aún poderoso). Puede que le resulte interesante: Uso de SQLite como formato de archivo en disco, Parte 2 .
fuente
En cuanto a las bibliotecas "integradas", las
<<
y>>
se han reservado específicamente para la serialización.Debe anular la
<<
salida de su objeto a algún contexto de serialización (generalmente uniostream
) y>>
leer los datos desde ese contexto. Cada objeto es responsable de generar sus objetos secundarios agregados.Este método funciona bien siempre que su gráfico de objeto no contenga ciclos.
Si es así, tendrá que usar una biblioteca para manejar esos ciclos.
fuente
<<
operadores implementados se utilizan para imprimir representaciones de texto legibles por humanos de objetos, que a menudo no es lo que desea para la serialización.<<
el genéricoostream
, intente definirlo para una secuencia de archivos.<<
salida de su objeto a algún contexto de serialización ... Cada objeto es responsable de generar su ..." - la pregunta es cómo evitar tener que escribir eso laboriosamente para cada objeto: cuánto puede idioma o bibliotecas ayuda?Recomiendo los buffers de protocolo de Google . Tuve la oportunidad de probar la biblioteca en un nuevo proyecto y es muy fácil de usar. La biblioteca está muy optimizada para el rendimiento.
Protobuf es diferente de otras soluciones de serialización mencionadas aquí en el sentido de que no serializa sus objetos, sino que genera código para los objetos que son serialización de acuerdo con sus especificaciones.
fuente
Boost :: serialización es una gran opción, pero me he encontrado con un nuevo proyecto: ¡ Cereal que me parece mucho más elegante! Le recomiendo investigarlo.
fuente
Puede verificar el protocolo amef , un ejemplo de codificación C ++ en amef sería,
Decodificar en Java sería como,
La implementación del protocolo tiene códecs tanto para C ++ como para Java, la parte interesante es que puede retener la representación de la clase de objeto en forma de pares de nombre y valor, requerí un protocolo similar en mi último proyecto, cuando accidentalmente me topé con este protocolo, en realidad modificó la biblioteca base de acuerdo con mis requisitos. Espero que esto te ayude.
fuente
Recomiendo usar la serialización de impulso como se describe en otros pósters. Aquí hay un buen tutorial detallado sobre cómo usarlo que complementa muy bien los tutoriales de impulso: http://www.ocoudert.com/blog/2011/07/09/a-practical-guide-to-c-serialization/
fuente
Dulce persistir es otro.
Es posible serializar hacia y desde secuencias en XML, JSON, Lua y formatos binarios.
fuente
Sugiero buscar en fábricas abstractas, que a menudo se utiliza como base para la serialización
He respondido en otra pregunta SO sobre las fábricas de C ++. Por favor mira allí si una fábrica flexible es de interés. Intento describir una forma antigua de ET ++ para usar macros que me ha funcionado muy bien.
ET ++ fue un proyecto para portar MacApp antiguo a C ++ y X11. En su esfuerzo, Eric Gamma, etc., comenzó a pensar en Patrones de diseño . ET ++ contenía formas automáticas de serialización e introspección en tiempo de ejecución.
fuente
Si desea un rendimiento simple y óptimo y no le importa la compatibilidad con datos anteriores, pruebe con HPS , es liviano, mucho más rápido que Boost, etc., y mucho más fácil de usar que Protobuf, etc.
Ejemplo:
fuente
Aquí hay una biblioteca de serializador simple que eliminé. Es solo encabezado, c11 y tiene ejemplos para serializar tipos básicos. Aquí hay uno para un mapa a la clase.
https://github.com/goblinhack/simple-c-plus-plus-serializer
Salida:
fuente
Estoy usando la siguiente plantilla para implementar la serialización:
Aquí
T
está el tipo que desea serializarMode
es un tipo ficticio para diferenciar entre diferentes tipos de serialización, por ejemplo. el mismo número entero se puede serializar como little endian, big endian, varint, etc.Por defecto,
Serializer
delega la tarea al objeto que se está serializando. Para los tipos integrados, debe hacer una especialización de plantilla deSerializer
.También se proporcionan plantillas de funciones de conveniencia.
Por ejemplo, pequeña serialización endiana de enteros sin signo:
Luego para serializar:
Para deserializar:
Debido a la lógica del iterador abstracto, debería funcionar con cualquier iterador (por ejemplo, iteradores de flujo), puntero, etc.
fuente