Un modo semplice per ottenere una parvenza di versioning è dare un senso ai membri degli oggetti che si stanno serializzando. Se il tuo codice ha una comprensione dei vari tipi di dati da serializzare, puoi ottenere un po 'di robustezza senza fare troppo lavoro.
Supponiamo di avere un oggetto serializzato simile al seguente:
ObjectType
{
m_name = "a string"
m_size = { 1.2, 2.1 }
m_someStruct = {
m_deeperInteger = 5
m_radians = 3.14
}
}
Dovrebbe essere facile vedere che il tipo ObjectType
ha chiamato membri di dati m_name
, m_size
em_someStruct
. Se è possibile eseguire il ciclo o enumerare i membri dei dati durante il runtime (in qualche modo), durante la lettura di questo file è possibile leggere un nome di membro e abbinarlo a un membro effettivo all'interno dell'istanza dell'oggetto.
Durante questa fase di ricerca se non trovi un membro di dati corrispondente puoi tranquillamente ignorare questa parte del file di salvataggio. Ad esempio, dire che la versione 1.0 di SomeStruct
aveva un m_name
membro dati. Quindi patch e questo membro di dati è stato rimosso completamente. Quando carichi il tuo file di salvataggio, ti imbatteraim_name
un membro corrispondente e non troverai alcuna corrispondenza. Il codice può semplicemente passare al membro successivo nel file senza arresti anomali. Ciò consente di rimuovere i membri dei dati senza preoccuparsi di rompere i vecchi file di salvataggio.
Allo stesso modo se aggiungi un nuovo tipo di membro di dati e provi a caricare da un vecchio file di salvataggio il tuo codice potrebbe non inizializzare il nuovo membro. Questo può essere utilizzato a vantaggio: i nuovi membri dei dati possono essere inseriti manualmente nei file di salvataggio durante l'applicazione di patch, magari introducendo valori predefiniti (o con mezzi più intelligenti).
Questo formato consente inoltre di manipolare o modificare manualmente i file di salvataggio; l'ordine in cui i membri dei dati non hanno molto a che fare con la validità della routine di serializzazione. Ogni membro viene consultato e inizializzato in modo indipendente. Questa potrebbe essere una bontà che aggiunge un po 'più di robustezza.
Tutto ciò può essere ottenuto attraverso una qualche forma di introspezione di tipo. Dovrai essere in grado di eseguire una query su un membro di dati mediante la ricerca di stringhe e di sapere quale sia il tipo effettivo di dati del membro di dati. Ciò può essere ottenuto in C ++ utilizzando una forma di introspezione personalizzata e altre lingue potrebbero avere strutture di introspezione integrate.