Un moyen simple d'obtenir un semblant de version est de donner un sens aux membres des objets que vous sérialisez. Si votre code comprend les différents types de données à sérialiser, vous pouvez obtenir une certaine robustesse sans faire trop de travail.
Disons que nous avons un objet sérialisé qui ressemble à ceci:
ObjectType
{
m_name = "a string"
m_size = { 1.2, 2.1 }
m_someStruct = {
m_deeperInteger = 5
m_radians = 3.14
}
}
Il devrait être facile de voir que le type ObjectType
a des membres de données appelés m_name
, m_size
et m_someStruct
. Si vous pouvez boucler ou énumérer des membres de données pendant l'exécution (d'une manière ou d'une autre), lors de la lecture de ce fichier, vous pouvez lire un nom de membre et le faire correspondre à un membre réel dans votre instance d'objet.
Au cours de cette phase de recherche, si vous ne trouvez pas de membre de données correspondant, vous pouvez ignorer en toute sécurité cette partie du fichier de sauvegarde. Par exemple, disons que la version 1.0 de SomeStruct
avait un m_name
membre de données. Ensuite, vous corrigez et ce membre de données a été entièrement supprimé. Lors du chargement de votre fichier de sauvegarde, vous rencontrerez m_name
un membre correspondant et vous ne trouverez aucune correspondance. Votre code peut simplement passer au membre suivant dans le fichier sans se bloquer. Cela vous permet de supprimer des membres de données sans vous soucier de casser les anciens fichiers de sauvegarde.
De même, si vous ajoutez un nouveau type de membre de données et essayez de charger à partir d'un ancien fichier de sauvegarde, votre code risque de ne pas initialiser le nouveau membre. Cela peut être utilisé à un avantage: de nouveaux membres de données peuvent être insérés dans les fichiers de sauvegarde pendant le patch manuellement, peut-être en introduisant des valeurs par défaut (ou par des moyens plus intelligents).
Ce format permet également aux fichiers de sauvegarde d'être facilement manipulés ou modifiés à la main; l'ordre dans lequel les membres des données n'ont pas vraiment grand-chose à voir avec la validité de la routine de sérialisation. Chaque membre est recherché et initialisé indépendamment. Cela pourrait être une subtilité qui ajoute un peu de robustesse supplémentaire.
Tout cela peut être réalisé par une certaine forme d'introspection de type. Vous voudrez pouvoir interroger un membre de données par recherche de chaîne et être en mesure de dire quel est le type réel de données du membre de données. Cela peut être réalisé en C ++ en utilisant une forme d'introspection personnalisée, et d'autres langages peuvent avoir des fonctionnalités d'introspection intégrées.