tipos significado serializar serializacion que objeto deserializar deserializacion c++ serialization

c++ - significado - serializar xml c#



¿Es posible serializar y deserializar una clase en C++? (11)

Boost es una buena sugerencia. Pero si desea hacer su propio, no es tan difícil.

Básicamente, solo necesita una forma de crear un gráfico de objetos y luego enviarlos a algún formato de almacenamiento estructurado (JSON, XML, YAML, lo que sea). Construir el gráfico es tan simple como utilizar un algoritmo decente de objeto recursivo y luego generar todos los objetos marcados.

Escribí un artículo que describe un sistema de serialización rudimentario (pero aún poderoso). Puede encontrarlo interesante: Usar SQLite como formato de archivo en disco, Parte 2 .

¿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 idioma. ¿Tiene C ++ características similares? ¿Hay bibliotecas nativas que manejan la serialización?

Un ejemplo sería útil.


En cuanto a las bibliotecas "integradas", los << y >> se han reservado específicamente para la serialización.

Debería anular << para dar salida a su objeto a algún contexto de serialización (generalmente un iostream ) y >> para leer datos de ese contexto. Cada objeto es responsable de generar sus objetos secundarios agregados.

Este método funciona bien siempre que su gráfico de objetos no contenga ciclos.

Si lo hace, entonces tendrá que usar una biblioteca para lidiar con esos ciclos.


Me doy cuenta de que esta es una publicación anterior, pero es una de las primeras que aparece cuando c++ serialization .

Animo a cualquiera que tenga acceso a C ++ 11 a echarle un vistazo a cereal , una biblioteca de solo encabezado C ++ 11 para serialización que admite binarios, JSON y XML listos para usar. el cereal fue diseñado para ser fácil de extender y usar y tiene una sintaxis similar a Boost.


Puedes verificar el protocolo amef , un ejemplo de codificación C ++ en amef sería como

//Create a new AMEF object AMEFObject *object = new AMEFObject(); //Add a child string object object->addPacket("This is the Automated Message Exchange Format Object property!!","adasd"); //Add a child integer object object->addPacket(21213); //Add a child boolean object object->addPacket(true); AMEFObject *object2 = new AMEFObject(); string j = "This is the property of a nested Automated Message Exchange Format Object"; object2->addPacket(j); object2->addPacket(134123); object2->addPacket(false); //Add a child character object object2->addPacket(''d''); //Add a child AMEF Object object->addPacket(object2); //Encode the AMEF obejct string str = new AMEFEncoder()->encode(object,false);

Descodificar en Java sería como

string arr = amef encoded byte array value; AMEFDecoder decoder = new AMEFDecoder() AMEFObject object1 = AMEFDecoder.decode(arr,true);

La implementación del protocolo tiene códecs para C ++ y Java, la parte interesante es que puede retener la representación de la clase de objeto en forma de pares de nombre-valor, requirí un protocolo similar en mi último proyecto, cuando por casualidad tropecé con este protocolo, tuve modifiqué la biblioteca base según mis requisitos. Espero que esto te ayude.


Recomiendo los búferes de protocolo de Google. Tuve la oportunidad de probar la biblioteca en un nuevo proyecto y es notablemente 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 objetos que son serializados de acuerdo con su especificación.



Si desea un rendimiento simple y mejor y no le importa la compatibilidad de datos hacia atrás, 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:

std::vector<int> data({22, 333, -4444}); std::string serialized = hps::serialize_to_string(data); auto parsed = hps::parse_from_string<std::vector<int>>(serialized);


Sugiero buscar fábricas abstractas que a menudo se utilizan como base para la serialización

He respondido en otra pregunta sobre las fábricas C ++. Por favor, vea there si una fábrica flexible es de interés. Intento describir una antigua forma de ET ++ para usar macros, que me ha funcionado muy bien.

ET++ era 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 para la serialización y la introspección en tiempo de ejecución.


Boost::serialization es una gran opción, pero me he encontrado con un nuevo proyecto: ¡ cereal que encuentro mucho más elegante! Recomiendo investigarlo.


Sweet Persist es otro.

Es posible serializar desde y hacia las secuencias en formato XML, JSON, Lua y binario.


La biblioteca de Boost::serialization maneja esto de manera bastante elegante. Lo he usado en varios proyectos. Hay un programa de ejemplo, que muestra cómo usarlo, here .

La única forma nativa de hacerlo es usar transmisiones. Básicamente, eso es todo lo que hace la biblioteca de Boost::serialization , amplía el método de flujo al configurar un marco para escribir objetos en un formato de texto y leerlos del mismo formato.

Para los tipos incorporados, o sus propios tipos con operator<< y operator>> correctamente definidos, eso es bastante simple; ver las preguntas frecuentes de C ++ para más información.