Hay muchas formas de manejar el problema de versiones; puede hacerlo teniendo una función de carga por versión, puede intentar automatizar el proceso describiendo (a través de los atributos usualmente) la transformación de la estructura del activo a lo largo del tiempo, puede hacer verificaciones específicas de la versión dentro de las funciones de carga / guardar, etc. .
Me gusta el enfoque de "describir los cambios" pero encuentro que tratar de hacerlo a través de atributos se vuelve incómodo rápidamente . Yo usaría funciones en su lugar; implementar una función que transforma los datos en la versiónN
en datos en versión N + 1
para toda su versión apropiada. En carga, verifique la versión con la última y, si no es así, ejecute los datos a través de todas las funciones de versiones apropiadas. Siempre guarde la última versión.
Esto funciona mejor si realiza la transformación cuando los datos todavía están en un formulario clave-valor en tiempo de ejecución. Esto significa que probablemente querrá implementar una representación para sus datos que sea un enfoque de "bolsa de propiedades de tiempo de ejecución", porque no puede usar la forma de valor clave subyacente de JSON o XML si tiene su propio formato binario. Si no hace esto, es posible que también deba mantener definiciones antiguas de clases, lo que se vuelve feo. Ser capaz de tener sus activos en este formato incorrecto de propiedad también es tremendamente útil para el desarrollo del editor de juegos.
Durante el desarrollo a medida que itera en sus datos, naturalmente se disparará a la última versión y eventualmente puede eliminar las funciones de versiones anteriores. Este es más o menos el mismo enfoque de alto nivel que usamos para la versión de los activos artísticos (como los mapas) en Guild Wars 2.
Ahora, dicho todo esto, creo que es útil admitir la serialización de texto y binaria para activos. Durante el desarrollo, mantenga todos sus datos en un formato legible por humanos basado en XML o JSON. Esto puede aumentar mucho su capacidad de iteración porque no necesita crear herramientas tan complejas para editar los datos. Puede volver a realizar ajustes rápidos y simples a mano.
En segundo lugar, suponiendo que aún desee un formato binario para enviar el juego (que puede mejorar el tamaño del archivo o los tiempos de E / S del archivo, por lo que es un deseo válido), diseñe sus API de serialización y deserialización para manejar el control de versiones. El control de versiones sigue siendo útil en un contexto de envío, porque en algún momento es posible que desee enviar actualizaciones o correcciones de errores. Hay algunos documentos que describen las capacidades de control de versiones de la serialización .NET y la serialización de Boost que pueden resultar interesantes. Si se va a apoyar el texto y formatos binarios, asegúrese de probar de vez en cuando (o pruebas de construcción automatizados para hacerlo, incluso mejor).