¿Cuál es un buen diseño para permitir la compatibilidad con versiones anteriores de un tipo de archivo entre diferentes versiones de software?
Por ejemplo, ¿cómo obtiene Microsoft Word 2007, 2010 y 2013, etc.? Para todos los archivos docx abiertos, pero diferentes ediciones pueden guardar más / menos datos y guardar los datos de formas ligeramente diferentes, todo en el mismo tipo de archivo y un El archivo que se guarda en una versión se puede abrir en otra, pero ¿ciertos elementos del archivo pueden no estar disponibles en versiones anteriores?
Quiero decir, la forma realmente obvia de hacerlo es tener algo como
private string openfile(string filename)
{
File.Open(filename)
... some logic that gets a header from the file that will never change
switch (fileversion)
case 2007:
.....
case 2010
.....
case 2013
.....
}
pero eso parece increíblemente monolítico, no muy extensible y es probable que genere una gran cantidad de código copiado / pegado.
Así que estaba pensando en usar una interfaz base para todas las versiones que define las estructuras inmutables, como el encabezado, que deben estar presentes en el archivo, y los métodos que deben estar disponibles para la serialización / deserialización, y luego la herencia múltiple para que cada La clase de la nueva versión que implementa la interfaz hereda la versión anterior, y solo anula las cosas que han cambiado, ya que el archivo será el mismo, en su mayor parte.
Realmente no me preocupa la estructura del archivo, ya que ya se decidió que usaremos XML, y el esquema inicial ya está decidido. Sin embargo, sin duda habrá cambios en él en el futuro, y solo quiero poder diseñar el código de una manera que facilite acomodar estos cambios.