Esistono molti modi per gestire il problema delle versioni; puoi farlo avendo una funzione di caricamento per versione, puoi provare ad automatizzare il processo descrivendo (attraverso gli attributi di solito) la trasformazione della struttura degli asset nel tempo, puoi fare controlli specifici della versione all'interno delle funzioni di caricamento / salvataggio, eccetera .
Mi piace l'approccio "descrivi i cambiamenti", ma trovo che provare a farlo tramite gli attributi diventa scomodo e veloce . Userei invece le funzioni; implementare una funzione che trasforma i dati in versione N
in dati in versione N + 1
per tutta la versione appropriata. Al caricamento, controlla la versione con l'ultima e, in caso contrario, esegui i dati attraverso tutte le funzioni di versioning appropriate. Salva sempre l'ultima versione.
Funziona meglio se si esegue la trasformazione quando i dati sono ancora in un formato valore-chiave runtime. Ciò significa che probabilmente vorrai implementare una rappresentazione per i tuoi dati che è un approccio "runtime bag of properties", perché non puoi utilizzare il modulo chiave-valore sottostante di JSON o XML se hai il tuo formato binario. Se non lo fai, potresti anche aver bisogno di mantenere vecchie definizioni di classe, il che diventa brutto. Essere in grado di avere le tue risorse in questo cattivo formato della proprietà è anche estremamente utile per lo sviluppo dell'editor di giochi.
Durante lo sviluppo man mano che esegui l'iterazione dei tuoi dati, salirà naturalmente all'ultima versione e alla fine potrai eliminare le vecchie funzioni di controllo delle versioni. Questo è più o meno lo stesso approccio di alto livello utilizzato per la versione degli asset grafici (come le mappe) in Guild Wars 2.
Ora, tutto ciò detto, penso che sia utile supportare sia la serializzazione di testo che binaria per le risorse. Durante lo sviluppo, conserva tutti i tuoi dati in un formato leggibile dall'uomo basato su XML o JSON. Ciò può aumentare molto la tua capacità di iterazione perché non è necessario creare strumenti così complessi per la modifica dei dati. Puoi tornare a essere in grado di apportare semplici modifiche rapide a mano.
In secondo luogo, supponendo che si desideri ancora un formato binario per la spedizione del gioco (che può migliorare le dimensioni del file o i tempi di I / O del file, quindi è un desiderio valido), progettare le API di serializzazione e deserializzazione per gestire il versioning. Il controllo delle versioni è ancora utile in un contesto di spedizione, perché come alcuni punti potresti voler spedire aggiornamenti o correzioni di bug. Ci sono alcuni documenti che descrivono le capacità di versioning della serializzazione .NET e della serializzazione di Boost che potresti trovare interessanti. Se si sta andando a supportare sia il testo e formati binari, assicurarsi di testare loro di tanto in tanto (o test di compilazione automatica di farlo, ancora meglio).