Frage

Ein Projekt arbeite ich an erfordert eine Datenstruktur, die Serialisierung vor dem Herunterfahren und wieder seinen Zustand von diesen serialisierten Daten, wenn es wieder starten.

Im vergangenen Jahr waren wir bauen für .NET 1.1 und lief in ein heikles Thema, wo

  • unser Code lief auf .NET 2.0
  • ein Kunde mit einiger Software aktualisiert, die irgendwie 1.1 als Standard festlegen
  • unser Code lief auf .NET 1.1 und war nicht in der Lage seinen gespeicherten Zustand deserialisieren

Diese besondere Problem „gelöst“ durch war, dass bestimmte Software-Upgrade Sperre und sollte kein Problem jetzt sein, dass wir das .NET 2.0 Framework Targeting sind (so können wir möglicherweise nicht auf 1.1 ausgeführt werden).

Was ist die Chance, dass diese Serialisierung wieder inkompatibel zwischen 2.0 und neuen Rahmenbedingungen ändern könnte? Wenn wir <supportedVersion> verwenden unseren Code zu 2.0.50727 zu beheben, was sind die Chancen von Veränderungen zwischen 2.0.50727.1434 und 2.0.50727.nnnn (einige zukünftige Version)? Die Datenstrukturen serialisiert sind Arrays, Karten, Strings, etc. von den Standard-Klassenbibliotheken.

Darüber hinaus ist gewährleistet, dass ein 2.0.50727 Rahmen wird immer noch nach weiterem .NET-Upgrades installiert werden? Hinweise auf der Microsoft-Dokumentation willkommen.

War es hilfreich?

Lösung

Die Chancen sind gering (aber nicht Null!), Dass es Änderungen zwischen Framework-Versionen sein. Die Absicht wäre, dass Sie in der Lage sein sollten, binäre Serialisierung und Remoting-Kommunikation zwischen einem Client und einem Server mit unterschiedlichen Framework-Versionen zu verwenden. Die Inkompatibilität zwischen .NET 1.x und 2.0 ist ein Fehler , für die ein Patch verfügbar ist.

Allerdings binäre Serialisierung hat andere Probleme, vor allem schlechte Unterstützung für die Versionierung der Struktur Du Serialisierung. Vom Anwendungsfall Sie beschrieben haben, ist die XML-Serialisierung die offensichtliche Wahl: DataContractSerializer als XmlSerializer flexibler zu sein, wenn Sie die Abhängigkeit von .NET 3.x nichts dagegen

.

Sie können nicht garantieren, dass das .NET Framework 2.0 wird immer auf zukünftige Versionen von Windows installiert werden. Aber ich bin sicher, dass Microsoft hart arbeiten, um sicherzustellen, dass die meisten .NET 2.0-Anwendungen unverändert laufen auf .NET 4.x und neueren Versionen. Ich habe keine Hinweise dafür. Eine solche Verpflichtung in jedem Fall würde nur dann wirklich auf die nächste Version von Windows (Windows 7) anwenden

Andere Tipps

Die Daumenregel ist in der Regel: XML-Serialisierung der Lage sein sollten neue Framework-Versionen, um zu überleben und können daher langfristige, aber binäre Serialisierung kann nicht (und sollte daher immer nur als vorübergehend) gespeichert werden

.

Was Serializer verwenden Sie? In vielerlei Hinsicht puffert ein Serializer wie XmlSerializer oder DataContractSerializer Sie aus vielen Details und bietet einfachere Erweiterbarkeit Möglichkeiten. An einem gewissen Punkt wird eine neue CLR Version undoubtably notwendig sein - so dass ich glaube nicht, dass jemand irgendwelche Garantien über 2.0.50727 machen kann; sollten Sie sicher kurzfristige, obwohl sein. Und ich würde für weniger Bruch Änderungen hoffen ...

[letzte Änderung auf eine andere Antwort folgende Anmerkung]

Wenn Sie ein Binärformat für Raum / Leistungsgründen wollen, dann eine andere Option ist eine andere binäre Serializer zu verwenden. Zum Beispiel protobuf-net auf allen .NET funktioniert Varianten *, aber die binären Format (dvised von Google) ist Cross-Plattform-kompatibel (Java, C ++, etc.) - es ist sehr beweglich, schnell und klein zu machen

* = Ich habe es nicht auf Micro Framework versucht, aber CF, Silverlight, Mono, .NET 2.0 usw. werden unterstützt.

Wenn Kompatibilität ist ein Anliegen, das ISerializable Schnittstelle könnte die Heilung Sie suchen sein. Diese Schnittstelle gibt Ihnen mehr Kontrolle darüber, wie Elemente serialisiert werden. Für weitere Informationen versuchen, diese Artikel auf Msdn rel="nofollow.

Ich habe zwei Dinge zu den anderen Antworten ...

hinzufügen

Als erstes unter Verwendung eines kundenspezifischen SerializationBinder können Sie runden viele Schwierigkeiten bekommen serialisierten Daten importieren Vermächtnis.

Zweitens halte ich es für zwingend umfangreiche Unit-Tests für jede persistente Daten zu schreiben. Ich mache zwei Tests immer vor allem:

  1. Round-Trip-Test - können Sie serialisiert und Ihre Objekte deserialisieren und genau das Gleiche wieder
  2. Legacy-Import-Test - stellen Sie sicher, dass Sie von jeder freigegebenen Version der App exportierten Versionen von serialisierten Daten. Importieren Sie die Daten und prüfen, ob alles kommt wieder in wie erwartet.

Sie müssen XML nicht verwenden, um eine höhere Flexibilität und Versionierung zu gewinnen.

Ich habe Simon Hewitt Open-Source-Bibliothek verwendet wird, finden Sie unter

scroll top