2011-02-24 5 views
6

Tengo una pregunta sobre serializaton de estructuras de datos. Hay muchas posibilidades para la serialización de estructuras de datos (también llamado clasificación o deflactando, ver wiki-article). Cada lenguaje de programación, framework, estándar o biblioteca parece traer sus propios métodos de serialización. Muchos también definen su propio lenguaje de descripción de datos/interfaz (que prefiero al idioma depende de la estructura de datos definida solo dentro del código). Solo por nombrar algunos (consulte wiki-article): COM IDL, CORBA IDL, IDL de ahorro, búfer de protocolo de Google ".proto", XSD, ASN.1 IDL, y así sucesivamente. Algunas de estas serializaciones pueden generar código de estructura y datos nativos del lenguaje para serializar y deserializar estas estructuras.Fácil de usar serialización extensible/clasificación?

Hice algunas investigaciones sobre este tema, pero todavía estoy indeciso. Entonces mi pregunta es: ¿Qué serialización debo usar?

Mis requisitos: extensibilidad, la eficiencia del espacio (al menos binario), acceso eficiente a los datos, la facilidad de usar (posiblemente con código generado y getter y setters) y C++ - compability.

La extensibilidad debe proporcionar compatibilidad hacia delante y hacia atrás. Para ser más específico, a menudo los formatos de datos que escribo crecerán con el tiempo, porque agrego nuevos campos de datos, que no pude prever al comienzo del desarrollo. Ahora me gustaría poder leer los datos almacenados de un formato desactualizado con una versión de software más nueva, los campos de datos que no se encuentran en los datos almacenados antiguos podrían llenarse con valores predeterminados o algo así. Por otro lado, me gustaría poder leer los datos escritos con la nueva descripción. El software compilado con la descripción de datos "anterior" debe ignorar el campo de datos desconocido (quizás generando alguna advertencia).

¿Alguna recomendación? También se agradecerían las recomendaciones sobre otras lecturas sobre ese tema.

--- --- Editar

1) impulso :: serialización parece ser bastante popular. Tiene algunas características muy agradables, la documentación es muy buena, y la sintaxis parece ser bastante directa. Tal vez soy un poco exigente, pero hay algunas cosas que no me gustan: no veo cómo podría manejar la compatibilidad futura (ver 4). Prefiero el código generado.

2) Google protobuf parece encajar mejor en mis necesidades, pero no he investigado su profundidad. Parecen manejar bien la compatibilidad hacia adelante y hacia atrás (ver 5). Tienen generadores de código para diferentes idiomas, y los desarrolladores conocen conceptos similares (ver FAQ). Voy a echar un vistazo más profundo a los protobufs.

3) impulso espíritu no parece ser lo que busco.

+0

Sí, la compatibilidad con versiones anteriores lamentablemente no existe en boost :: serialization. Además, experimenté algunas pequeñas diferencias en los archivos XML generados en Mac y PC en una versión anterior de boost :: serialization, por lo que también existen dudas sobre la compatibilidad perfecta con ese formato. Indagar en Protobuf suena como la mejor idea, diga en qué dirección fue. –

Respuesta

2

Utilicé la biblioteca de serialización de boost por un tiempo: es extensible, eficiente y admite el control de versiones independiente para cada objeto que serializa. Todas estas características, por supuesto, significan que es una bestia compleja, y lleva tiempo aprender adecuadamente. No es tan rápido de compilar tampoco. Y si alguna vez intentas llevarlo a una plataforma que no es oficialmente compatible, espera la depuración de un código muy intrincado. La compatibilidad de archivos en todas las plataformas puede ser escamosa, y la compatibilidad con versiones anteriores no funcionará.En general, la serialización reforzada generalmente no es una buena opción en caso de que necesite instancias de aplicaciones que se comuniquen entre sí. Aún así, no es tan malo para el proyecto correcto.

http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/index.html

Boost también tiene la biblioteca más reciente Espíritu de análisis más genérico/salida, pero yo no lo he usado y no lo recomendaría sobre la base de las primeras impresiones - se necesita algo de investigación para entender lo que incluso la nombre peculiar biblioteca está destinado para.

Al final, para proyectos más sencillos, rodar su propia biblioteca de serialización puede que tampoco sea una mala elección, no es demasiado difícil y obtiene exactamente las características que necesita. Es decepcionante que el mundo de C++ todavía no tenga la serialización resuelta adecuadamente, pero esa fue la conclusión a la que llegué la última vez que tuve que decidir sobre la funcionalidad de serialización. Sin embargo, el uso de la serialización de boost por un tiempo me dio una buena idea de qué apuntar en mi propia implementación.

+0

+1 para boost :: serialize. Boost :: spirit es para analizar gramáticas. Entonces podría usarlo para la serialización, pero sería lento y difícil de mantener. –

+0

Sí, acabo de escuchar algunas referencias vagas al uso de Spirit para la serialización, pero sí, probablemente no sea la herramienta adecuada. –

+0

Gracias por su respuesta. Escuché sobre boost :: serializaton antes, pero no profundicé en eso, lo haré ahora. Tal vez es lo correcto para mí. – Metaprogger

2

Boost :: serialize es grande

  • compatible con diferentes versiones del archivo
  • un buen apoyo de la mayoría de las estructuras de datos (punteros, vectores ...)
  • muy rápido (10 segundos de 1 Gb por lo que la limitación es su disco duro)
  • Más bien fácil de usar
  • en la compresión de marcha si se utiliza con impulso :: iostreams

Los inconvenientes son:

  • El archivo podría no ser compatible desde un Plateform a otro
  • Sólo para C++, no hay intercambio con otros lenguajes

Una buena alternativa que está creciendo, es búferes de protocolo de Google http://code.google.com/p/protobuf/

  • idioma independiente
  • La compatibilidad de versiones
  • muy rápido

Así que si usted quiere intercambiar datos entre diferentes sistemas, me gustaría ir con Protocol Buffers. Sin embargo, si tiene una sola aplicación, usaría boost :: serialize

+0

Gracias por su respuesta. Tal vez tenga varias aplicaciones comunicándose a través de la red, ¿boost :: serialize no es adecuado entonces? – Metaprogger

+0

Boost :: serialize tiene muchos formatos como binario, texto o XML.Si usa texto o XML, no habrá problema. Sin embargo, el binario podría ser un problema. –

Cuestiones relacionadas