2013-03-26 7 views
11

Wenn ich ein Objekt serialisieren möchte, muss ich [Serializable] Attribut verwenden und alle Mitgliedsvariablen werden in die Datei geschrieben. Was ich nicht weiß, wie man z. Wenn ich eine neue Mitgliedsvariable hinzufüge (eine Variable umbenenne oder einfach eine Variable entferne) und dann die Datei öffne (Deserialisierung), wie kann ich die Objekt-/Dateiversion bestimmen, damit ich das neue Mitglied korrekt einstellen oder eine Art von Migration durchführen kann? Wie kann ich feststellen, dass die Variable während des Ladens initialisiert wurde oder nicht (ignoriert von Deserializer).Serialisierung und Objektversionierung in C#

Ich weiß, dass es versionstolerante Ansätze gibt und ich kann Variablen mit [OptionalField(VersionAdded = 1)] Attribut markieren. Wenn ich eine alte Datei öffne, ignoriert das Framework diese optionale (neue Variable) und es wird nur null/null sein. Aber wieder wie kann ich feststellen, ob die Variable durch Laden initialisiert oder ignoriert wurde.

Ich kann die Klassen-/Objektversionsnummer in den Stream schreiben. Verwenden Sie die Methode ISerializable und lesen Sie in der constructor(SerializationInfo oInfo, StreamingContext context) Methode diese Versionsnummer. Dies sagt mir genau, was die Klassenversion im Stream ist.

Allerdings habe ich erwartet, dass eine solche Versionierung bereits durch das Streaming-Framework in C# implementiert ist. Ich habe versucht, die Assembly-Version von der SerializationInfo zu erhalten, aber es wird immer auf die aktuelle Version und nicht auf die Version eingestellt, die beim Speichern des Objekts verwendet wurde.

Was ist der bevorzugte Ansatz? Ich fand eine Menge von Artikeln auf dem Netz, aber ich konnte nicht eine gute Lösung für diese, die Versionierung Adressen ...

Jede Hilfe ist willkommen Danke, Abyss

Antwort

2

Verzeihen Sie mir, wenn etwas von dem, was finde ich schreiben ist zu offensichtlich,

Zunächst bitte! Sie müssen aufhören zu denken, dass Sie ein Objekt serialisieren ... Das ist einfach falsch, da die Methoden, die Teil Ihres Objekts sind, nicht beibehalten werden. Sie sind persistent Informationen - und so .. nur DATA.

.NET Serialisierung auch Serialisierung des Typs Name Ihres Objekts, die den Assemblynamen und seine Version enthalten, so wenn Sie deserialize - es vergleicht die beibehaltene Assembly Informationen mit dem Typ, der mit den Informationen manifestiert werden - wenn sie nicht sind Gleiches wird eine Ausnahme zurückgeben.

Neben dem Problem der Versionsverwaltung - nicht alles kann so einfach serialisiert werden. Versuchen Sie, einen System.Drawing.Color-Typ zu serialisieren, und Sie werden die Probleme mit dem zu vereinfachenden Mechanismus der .NET-Serialisierung verstehen.

Sofern Sie nicht beabsichtigen, etwas wirklich einfaches zu serialisieren, das keine Pläne zur Weiterentwicklung hat, würde ich den von .NET bereitgestellten Serialisierungsmechanismus nicht verwenden.

Den Fokus zurück auf Ihre Frage zu bekommen, können Sie hier über die Versionierung Ignoranz Fähigkeit lesen: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80).aspx die für BinaryFormatter zur Verfügung gestellt wird.

Sie sollten auch XML-Serialisierung überprüfen, die einige nette Fähigkeiten hat, aber der größte Vorteil ist, dass Sie eine XML erhalten, die von Menschen lesbar ist, so dass Ihre Daten nie verloren gehen, selbst wenn Sie Komplikationen bei der Versionierung Ihrer Typen hatten.

Aber schließlich, ich empfehle, entweder Datenbank mit Entity Framework zu verwenden, um Ihre Daten persistent zu machen oder schreiben Sie Ihre eigenen Flat-Datei-Manager.während EF ist sehr gut für die meisten Lösungen, manchmal möchten Sie etwas leichter etwas sehr einfach zu beharren. (meine Implikation ist, dass ich keine Lösung mehr sehen kann, wo .NET-Serialisierung relevant sein kann.)

Ich hoffe, das hilft, Viel Glück.

+1

+1 für den Vorschlag, einen anderen Ansatz als .NET-Serialisierung zu verwenden. – Theraot