Wir verwenden BinaryFormatter in einem C # -Spiel, um Benutzerspielfortschritt, Spielniveaus usw. zu speichern. Wir stoßen auf das Problem der Rückwärtskompatibilität.
Die Ziele:
Die Lösung muss für Benutzer und Ebenenentwickler vollständig unsichtbar sein und Codierer, die etwas ändern möchten, minimal belasten (z. B. ein Feld umbenennen, weil sie an einen besseren Namen denken).
Einige Objektgraphen, die wir serialisieren, sind in einer Klasse verwurzelt, manche in anderen. Vorwärtskompatibilität ist nicht erforderlich.
Mögliche Änderungen (und was passiert, wenn wir die alte Version serialisieren und in die neue Version deserialisieren):
Ich habe gelesen:
Meine aktuelle Lösung :
.
%Vor%Einige Probleme damit:
Dies sollte ein wirklich häufiges Problem sein. Wie lösen die Leute es normalerweise?
Schwierig. Ich würde binär dump und XML-Serialisierung verwenden (einfacher zu verwalten, tolerant gegenüber Änderungen, die nicht zu extrem sind - wie das Hinzufügen / Entfernen von Feldern). In extremeren Fällen ist es einfacher, eine Transformation (xslt vielleicht) von einer Version in eine andere zu schreiben und die Klassen sauber zu halten. Wenn eine Deckkraft und ein geringer Platzbedarf auf der Festplatte erforderlich sind, können Sie versuchen, die Daten vor dem Schreiben auf die Festplatte zu komprimieren.
Wir haben das gleiche Problem in unserer Anwendung mit dem Speichern von Benutzerprofildaten (Gitterspaltenanordnung, Filtereinstellungen ...).
In unserem Fall war das Problem die AssemblyVersion.
Für dieses Problem erstelle ich ein SerializationBinder
, das die tatsächliche Assemblyversion von liest
die Assemblys (alle Assemblys erhalten bei der neuen Implementierung eine neue Versionsnummer)
mit Assembly.GetExecutingAssembly().GetName().Version
.
In der überschriebenen Methode BindToType
wird die Typinformation mit der neuen Assemblyversion erstellt.
Die Deserialisierung wird "von Hand" durchgeführt, dh
Funktioniert mit all unseren Daten und seit drei oder vier Releases.
Tags und Links .net backwards-compatibility binaryformatter