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.
Recomiendo usar la serialización de impulso como se describe en otros carteles. 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/
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.