Frage

Ich habe Daten, die unter Verwendung von binärer Serialisierung für die folgende Klasse gespeichert ist:

[Serializable]
public abstract class BaseBusinessObject
{
    private NameValueCollection _fieldErrors = new NameValueCollection();

    protected virtual NameValueCollection FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}

An einem gewissen Punkt wurde die Klasse dies geändert:

[Serializable]
public abstract class BaseBusinessObject
{
    private Dictionary<string, string> _fieldErrors = new Dictionary<string, string>();

    protected virtual Dictionary<string, string> FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}

Dies verursacht Probleme Deserialisieren alte Daten.

Mein erster Gedanke war ISerializable zu implementieren, aber diese Klasse hat Klassen zahlreiche Eigenschaften sowie Hunderte von Erben, die ich hätte dies auch für so umzusetzen.

Ich mag entweder die alten Daten ändert die aktuelle Struktur während der Deserialisierung zu erreichen oder haben eine saubere Art und Weise, die alten Daten zu aktualisieren.

War es hilfreich?

Lösung

Fügen Sie den neuen _fieldErrors unter einem anderen Namen, sagen _fieldErrors2, und machen es [Optional] . Dann implementieren eine [OnDeserialized] Methode, die kopiert die Daten von _fieldErrors _fieldErrors2 (falls vorhanden), und löscht _fieldErrors.

Andere Tipps

Wenn die Daten nur intern verwendet werden, mein erster Gedanke wäre, ein einfache Code-Wegwerf-schreiben Ihre binären Daten unter Verwendung der alte „Namevaluecollection“ deserialisieren, wo es zu einem Dictionnary und erneut serialisiert es. Auch wenn es ein paar Tage dauern werde, alle Daten zu verarbeiten, ist es nicht wert scheint es einen Patch auf Ihrem neuen Code zu implementieren, um die alten Daten zu unterstützen.

Auch wenn es nicht nur intern verwendet, ein Importeur wie der einfachste Weg scheint zu gehen.

Zusätzlich zu OlivierD ist ein guter Rat, würde ich vorschlagen, dass Sie beiden Klassen definieren, sondern zunächst versuchen, als die aktuelle Version deserialisieren. In Ihrem catch-Block, deserialisieren es als die Vorgängerversion, dann führen Sie ein Upgrade auf die aktuelle und speichern Sie sie zurück. Wenn keine Instanzen der Legacy-Version vorhanden ist, können Sie den Code entfernen.

Nach ein paar Optionen zu untersuchen, habe ich die folgenden Schlussfolgerungen:

Im Idealfall würde ich in der Lage sein, den Wert aus dem ursprünglichen NameValueCollection zugreifen und wandelt es manuell Dictionary<string, string>. Der einzige Weg, dies zu tun, wäre ISerializable zu implementieren, aber dies stellte zwei große Probleme: für alle Klassen erben auf die Namensgebung der Altdaten und die Einbeziehung der Serialisierung Logik der Zuordnung von (von denen es Hunderte).

Effektiv setzen diese mich in einer Bindung. Glücklicherweise konnte ich feststellen, dass dieses Feld wirklich nur als Zusammenfassung Form Validierungsfehler verwendet wird, und soll nicht in erster Linie serialisiert bekommen, deshalb habe ich es von Serialisierung ausgeschlossen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top