tipos serializar serialización serializacion que objeto ejemplos consiste binaria c++ c serialization binary implementation

c++ - serialización - serializar objeto c#



Serialización binaria en C/C++ puro (4)

En C pura, puedes usar el formato Binn .

Código de muestra:

binn *obj; // create a new object obj = binn_object(); // add values to it binn_object_set_int32(obj, "id", 123); binn_object_set_str(obj, "name", "John"); binn_object_set_double(obj, "total", 2.55); // send over the network or save to a file... send(sock, binn_ptr(obj), binn_size(obj)); // release the buffer binn_free(obj);

Me gustaría implementar la serialización binaria por mi cuenta, sin usar Boost ni ninguna otra biblioteca de terceros.

En C ++, la forma más sencilla de lograrlo es utilizar ofstream y luego enviar un archivo binario a través de la red. Pero, ¿hay alguna otra clase de flujo que pueda usar como un búfer temporal para evitar escribir un archivo en el disco?

Además, ¿cómo puedo lograr eso en C puro?


En algunos casos, cuando se trata de tipos simples, puede hacer:

object o; socket.write(&o, sizeof(o));


He estado usando JSON para serializar datos. Es simple, que es algo muy bueno. Es fácil obtener JSON correctamente, y es fácil saber si algo sale mal con él.

No es tan eficiente en cuanto a espacio como otros formatos, pero para muchos propósitos es lo suficientemente bueno. Y hay un código de biblioteca gratuito que puede obtener del sitio web de JSON.

http://json.org/


La persistencia es un problema difícil. No es trivial incluso serializar un objeto en el disco. Digamos que, por ejemplo, tiene una estructura como esta en C:

struct Person { char name[100]; int year; };

Esta es una estructura separada, probablemente la forma más simple en que se puede aplicar la serialización. Sin embargo, tendrás que enfrentar los siguientes problemas:

  1. El sistema de relleno del compilador. La forma de completar una estructura en la memoria para que ocupe un número entero de palabras en la memoria no es estándar.

  2. La forma en que el sistema operativo y la máquina representan los datos en forma binaria. Obviamente, esta representación cambia de una máquina a otra.

La conclusión es que un archivo creado incluso por el mismo programa en el mismo sistema operativo puede no ser compatible con el mismo programa en el mismo sistema operativo, porque tal vez ambos programas fueron compilados con diferentes compiladores de C.

Ahora veamos un objeto en C ++:

class Person { public: // more things... private: string name; Date * birth; Firm * firm; };

Ahora, lo mismo se ha vuelto realmente complejo. El objeto ya no es autónomo, debe seguir los punteros para decidir cómo tratar cada objeto (esto se llama 3. puntería swizzling y persistencia transitiva). Y todavía tienes 1) y 2) problemas.

Entonces, digamos que se enfoca en objetos autónomos y aún necesita una solución para los puntos 1 y 2. La única manera de hacerlo es decidir una representación en formato de texto a) ob) formato de código de bytes. El formato de bytecode puede ser entendido por cualquier programa en cualquier sistema operativo, compilado con cualquier compilador de C, porque la información es leída y escrita byte por byte. Esta es la forma en que Java o C # serializan sus objetos. El formato de texto como representación es tan válido como bytecode, aunque más lento. Su principal ventaja es que puede ser entendido tanto por un ser humano como por la computadora (un formato de texto estructurado podría ser XML).

Entonces, para serializar sus objetos autocontenidos, sin embargo, el formato de salida elegido, necesita tener funciones básicas (o clases en C ++) que puedan leer ints, caracteres, cadenas, etc. Cuando tenga los pares de escritura / lectura para cada uno, deberá proporcionarle al programador la posibilidad de crear sus propios pares de escritura / lectura para sus objetos, utilizando sus pares de lectura / escritura para datos elementales.

Estamos hablando aquí de un marco completo, algo así como lo que Python ofrece con su módulo Pickle .

Finalmente, el menor de sus problemas es poder guardar en caché su serialización en lugar de guardarla en el disco. Puede usar la clase ostringstream si está usando un formato basado en texto, o un bloque de memoria si está usando bytecode.

Como puede ver, no es un trabajo simple. Espero que esto ayude.