Eine einfache Möglichkeit, einen Anschein von Versionierung zu erwecken, besteht darin, die Mitglieder der Objekte, die Sie serialisieren, zu verstehen. Wenn Ihr Code die verschiedenen zu serialisierenden Datentypen versteht, können Sie eine gewisse Robustheit erzielen, ohne zu viel Arbeit zu leisten.
Angenommen, wir haben ein serialisiertes Objekt, das so aussieht:
ObjectType
{
m_name = "a string"
m_size = { 1.2, 2.1 }
m_someStruct = {
m_deeperInteger = 5
m_radians = 3.14
}
}
Es sollte leicht zu erkennen sein, dass der Typ ObjectType
Datenelemente aufgerufen wurden m_name
, m_size
undm_someStruct
. Wenn Sie Datenelemente zur Laufzeit (irgendwie) durchlaufen oder auflisten können, können Sie beim Lesen dieser Datei einen Mitgliedsnamen einlesen und ihn einem tatsächlichen Mitglied in Ihrer Objektinstanz zuordnen.
Wenn Sie in dieser Suchphase kein passendes Datenelement finden, können Sie diesen Teil der Sicherungsdatei ignorieren. Sagen Sie zum Beispiel Version 1.0 vonSomeStruct
hatte ein m_name
Datenelement. Dann patchen Sie und dieses Datenelement wurde vollständig entfernt. Beim Laden Ihrer Sicherungsdatei werden Sie darauf stoßenm_name
ein passendes Mitglied und keine Übereinstimmung finden. Ihr Code kann einfach ohne Absturz zum nächsten Mitglied in der Datei weitergeleitet werden. Auf diese Weise können Sie Datenelemente entfernen, ohne sich Sorgen machen zu müssen, dass alte Sicherungsdateien beschädigt werden.
Wenn Sie einen neuen Typ eines Datenelements hinzufügen und versuchen, aus einer alten Sicherungsdatei zu laden, initialisiert Ihr Code das neue Mitglied möglicherweise nicht. Dies kann zu einem Vorteil genutzt werden: Neue Datenelemente können beim manuellen Patchen in Sicherungsdateien eingefügt werden, möglicherweise durch Einführung von Standardwerten (oder auf intelligentere Weise).
Mit diesem Format können die gespeicherten Dateien auch einfach von Hand bearbeitet oder geändert werden. Die Reihenfolge, in der die Datenelemente nicht wirklich viel mit der Gültigkeit der Serialisierungsroutine zu tun haben. Jedes Mitglied wird unabhängig nachgeschlagen und initialisiert. Dies könnte eine Schönheit sein, die ein wenig zusätzliche Robustheit hinzufügt.
All dies kann durch irgendeine Art von Selbstbeobachtung erreicht werden. Sie möchten in der Lage sein, ein Datenelement durch Zeichenfolgensuche abzufragen und den tatsächlichen Datentyp des Datenelements zu ermitteln. Dies kann in C ++ mithilfe einer benutzerdefinierten Introspektion erreicht werden, und in anderen Sprachen sind möglicherweise Introspektionsfunktionen integriert.