Almacenar y mantener objetos serializados en C #

8

¿Cuáles son las mejores prácticas para almacenar y mantener objetos serializados en C #? ¿Alguna estrategia o patrón que aplique?

Lo que he llegado a creer hasta ahora es esto:

  • Prefiero Json sobre XML, tanto por espacio como por velocidad, pero xml es más fácil de consultar / extraer datos a través de LINQ to XML para conjuntos de datos más grandes.
  • Para cada propiedad individual, asigne explícitamente a un nombre serializado. En el futuro, cuando necesite cambiar el nombre de una propiedad, sus datos serializados no se romperán. Los atributos ayudan con esto.
  • Almacene algún tipo de información de versión en el objeto serializado, en caso de que necesite migrar datos en masa en el futuro

Actualización: (que descubrí por las malas)

  • Almacene todas las fechas de manera uniforme en toda la aplicación y en todas las versiones. Tanto en formato como en zona horaria.
Mihalis Bagos
fuente
¿Qué operaciones se realizarán en esos datos serializados? ¿Solo leer / escribir o algo más complejo?
Eufórico
Es más una pregunta general, pero en mi caso necesito almacenar pequeños objetos de configuración que podrían actualizarse o no.
Mihalis Bagos
2
4. Siga las reglas hasta que tenga más sentido romper las reglas.
Robert Harvey
1
¿Qué quieres decir? ¿Cuáles son "las reglas" en este caso?
Mihalis Bagos

Respuestas:

9

He hecho bastante serialización a lo largo de los años. Aquí hay algunas cosas que se nos ocurrieron:

  • Prefiere formatos legibles por humanos sobre formatos binarios. Generalmente prefiero Xml a Json principalmente porque puedes usar Xslt para transformar Xml cuando necesites actualizar la versión.

  • Independientemente de lo que esté serializando, la lógica de deserialización y el almacenamiento de datos deben permitir el control de versiones de los datos serializados. La información de la versión probablemente debería estar fuera de los datos serializados, lo que facilita un poco el acceso y la elección de la estrategia de deserialización correcta.

  • Su serialización debe tener pruebas unitarias que se ejecuten en ambos sentidos. Es decir, debe hacerse una prueba deserializando los datos y confirmando que todo se importó correctamente. Y debe tener algo que serialice los datos y confirme que sale como json y xml correctos.

  • Si el punto de dicha serialización es multiplataforma, pruebe contra la otra plataforma. Probablemente no sea tan problemático ahora como las plataformas han madurado, pero hubo momentos en que las cosas no estaban de acuerdo sobre cómo se debería formatear json.

Wyatt Barnett
fuente
4

Los puntos mencionados son prácticos y es bueno tenerlos en cuenta. Me gustaría mencionar diferentes tipos de serializaciones que pueden ser útiles para considerar dependiendo de las necesidades de su aplicación.

  • Serialización binaria : utiliza codificación binaria para producir una serialización compacta para usos como storageo socket-based network flujos.
  • Serialización XML : serializa los campos públicos y las propiedades de un objeto, o los parámetros y valores de retorno de los métodos, en una secuencia XML que se ajusta a un documento específico de lenguaje de definición de esquema XML (XSD). Hay más información disponible en System.Xml.Serialization namespace .
  • Serialización SOAP : es una versión diferente de la serialización XML, donde se puede usar para serializar objetos en flujos XML que se ajustan a la especificación SOAP. SOAP es un protocolo basado en XML, diseñado específicamente para transportar llamadas a procedimientos usando XML. Al igual que con la serialización XML normal, los atributos se pueden usar para controlar los mensajes SOAP de estilo literal generados por un servicio web XML.

Más información de la fuente oficial: programación de MSDN C #

Además, todo esto debe ser prácticas dentro del proceso SDLC (es decir, tener un entorno para probar, control de versiones, etc.)

Yusubov
fuente
¿Por qué querrías almacenarlo como binario o jabón? Por lo que yo entiendo, el jabón está sobrecargado para evitar la corrupción de datos, algo que no es un problema mientras se almacena en un sistema conocido.
Mihalis Bagos
1
Se trata de la velocidad, la más rápida es la serialización binaria.
Yusubov
BinaryFormatter es también la opción de menor tolerancia al cambio. Hemos tenido luchas interminables con él y ahora desearíamos nunca haberlo usado. Ver: stackoverflow.com/a/703361/505697
HappyCat
claro, todo tiene sus propios problemas y depende de dónde se use. Como se menciona, para la compatibilidad multiplataforma no es una opción ideal, aquí es donde la serialización XML toma la etapa.
Yusubov