c# - significado - Las entidades utilizadas para serializar los datos han cambiado. ¿Cómo se pueden actualizar los datos serializados para las nuevas entidades?
tipos de serializacion (3)
Deberás escribir un programa que
- deserializa los datos en la versión anterior de la entidad
- transforma la versión anterior de la entidad en la nueva versión de la entidad
- serializa la nueva versión de la entidad de vuelta al archivo.
Si lo serialó en XML, probablemente podría escribir un XSLT para realizar los cambios necesarios directamente.
Tengo un montón de instancias de entidades simples que he serializado en un archivo. En el futuro, sé que la estructura de estas entidades (es decir, tal vez cambie el nombre de Nombre a encabezado o algo así). La cuestión es que no quiero perder los datos que he guardado en todos estos archivos antiguos. ¿Cuál es la forma correcta de cualquiera de
- cargar los datos de las entidades antiguas en nuevas entidades
- actualizar los archivos antiguos para que puedan ser utilizados con nuevas entidades
Nota: Creo que estoy atascado con la serialización binaria, no con la serialización xml.
¡Gracias por adelantado!
Editar: Así que tengo una respuesta para el caso que he descrito. Puedo usar dataContractSerializer y hacer algo como
[DataMember("bar")]
private string foo;
y cambie el nombre en el código y mantenga el mismo nombre que se utilizó para la serialización. Pero, ¿qué pasa con los siguientes casos adicionales?
- La entidad original tiene nuevos miembros que se pueden serializar
- Algunos miembros serializados que estaban en la entidad original se eliminan
- Algunos miembros realmente han cambiado en la función (supongamos que la clase original tenía un miembro FirstName y LastName y se ha refactorizado para tener solo un miembro FullName que combine los dos)
Para manejar esto, necesito algún tipo de clase de deserialización de intérprete / traductor pero no tengo idea de qué debo usar
He usado BinaryFormatter, luego tenga en cuenta que este es un serializador de campo , no un serializador de propiedades; puedes hackearlo sin cambiar los nombres de los campos. A menos que sea una propiedad implementada automáticamente, en cuyo caso no puede.
Para ser sincero, BinaryFormatter es una mala elección si quieres flexibilidad para mutar los tipos. Un serializador basado en contrato es mucho más flexible aquí. Por ejemplo, XmlSerializer y DataContractSerializer le permiten controlar los nombres a través de un atributo.
Si quieres binario, me gustaría ir con protobuf-net (tal vez porque lo escribí ...) - aquí no hay nombres, solo identificadores numéricos. Pero el formato protobuf fue diseñado por Google específicamente para permitir la actualización sin problemas de las API.
Por supuesto, también puede mirar a un DTO como contrato permanente; en ese caso, considere tener un DTO v1, un DTO v2, etc. No es la manera en que tiendo a hacerlo yo mismo, pero definitivamente es una opción.
No importa qué mecanismo de serialización utilice, renombrar una propiedad es un cambio radical. El problema con la serialización binaria es que no puede actualizar fácilmente los archivos al nuevo formato, lo que sería una tarea más fácil con la serialización de formato de texto.