Al haber leído Data Contract Versioning, hemos llegado a la conclusión de que no es realmente la historia completa. Por ejemplo, ¿qué sucede si solía tener ValueA, y en la nueva versión ahora se llama ValueB y es de un tipo diferente, y necesita convertir ValueA en ValueB?Versiones de archivos de datos simples con DataContractSerializer
Hay algunos callbacks que podría utilizar para ayudar con esto, pero no parece una solución muy fácil de mantener si esperamos que el formato cambie con frecuencia durante un largo período de tiempo.
La solución que establecimos es mantener un campo "guardado por versión", y al cargar las rutinas de conversión de invocación de archivos específicas para las versiones anteriores según sea necesario. Estas rutinas de conversión saben cómo convertir XML para datos más antiguos a XML para datos más nuevos.
Sin embargo, como resulta, DataContractSerializes requires the order of the elements to be exactly what it expects. Esto significa que nuestro proceso de conversión debe saber insertar elementos en exactamente la ubicación correcta. Esto es mucho más difícil que simplemente agregar un elemento con un nombre conocido, si se tiene en cuenta la herencia. Con la herencia, no se puede o AddAfterSelf
campo de manera confiable, simplemente porque no hay un solo campo que esté siempre al lado de este nuevo campo.
Dejando de lado las razones por las que DataContractSerializer se hizo tan estricto, ¿puede sugerir formas de evitar esto? Tal vez un excelente artículo sobre cómo permanecer compatible con versiones anteriores de contratos de datos muy antiguos, que no se vuelven difíciles de manejar en el momento en que realizó el cambio número 100 al formato.
Hay algunas pautas adicionales en this article, pero esto debe haber sido escrito para un propósito diferente. Por ejemplo, no hay forma de que podamos dejar a los viejos miembros de datos rondando por siempre (punto 9). Parece que la mayoría de dichos artículos se escriben desde el punto de vista del protocolo de comunicación, en lugar de almacenar datos en un archivo.
Es un contrato bastante grande; Realmente odiaría copiar y pegar la mayor parte simplemente para cambiar un bool "Habilitado" a un "Estado" enum, por ejemplo. Voy a seguir con el preprocesamiento de XML, que, a pesar de los problemas descritos en la pregunta, es, por lo general, bastante fácil de implementar. –