Objekt in Assembly deserialisieren, das jetzt signiert und versioniert ist

8

Ich habe eine Baumansicht mit dem BinaryFormatter (c #) serialisiert. Die Assembly, die genau das getan hat und die alle serialisierbaren Klassen enthält, hat jetzt einen starken Namen und ist signiert und hat auch eine neue Versionsnummer erhalten (die Implementierung hat sich jedoch nicht geändert).

Wenn ich versuche das Array byte [] zu deserialisieren, die Zeile

%Vor%

erzeugt eine ArgumentNullException. (Parametername: Typ)

Ich dachte, die Versionsnummer ist das Problem, also habe ich eine eigene Sammelmappe implementiert. Ich habe die BindToType-Methode überschrieben und sichergestellt, dass die Version korrigiert und der richtige Typ zurückgegeben wird.

Im Moment jedoch verlässt das Programm die BindToType-Methode, ich bekomme trotzdem die oben erwähnte Ausnahme.

Wie behebe ich das?

    
Mephisztoe 23.04.2009, 08:02
quelle

3 Antworten

11

Sie können eine SerializationBinder verwenden, um dies zu lösen:

%Vor%

Dann

%Vor%

Voila, Ihre alten serialisierten Objekte können mit diesem Formatierer deserialisiert werden. Wenn sich der Typ ebenfalls geändert hat, können Sie mit einem SerializationSurrogate die alten Typen in Ihre neuen Typen deserialisieren.

Wie andere bereits erwähnt haben, ist es eine gute Idee, Ihre eigene Serialisierung durchzuführen, anstatt sich auf IFormatter zu verlassen, da Sie viel mehr Kontrolle über Versionierung und serialisierte Größe haben.

    
Matt Howells 10.11.2009 16:08
quelle
3

Sie könnten versuchen mit einem Serialisierungs-Surrogat, aber ohne etwas, das wir reproduzieren können, wird es schwierig sein, eine vernünftige Antwort zu geben.

Das grundlegende Problem ist jedoch, dass BinaryFormatter einfach sehr, sehr brüchig ist, wenn es um Dinge wie Baugruppen geht. Verdammt, es ist sogar genug in einer Versammlung brüchig genug.

Es klingt wie TreeViewData ist baumbasiert, also frage ich mich, ob xml eine bessere (d. h. mehr versionstolerante) Option wäre. Wenn Effizienz ein Problem darstellt, gibt es benutzerdefinierte Binärformate (wie protobuf-net ), die eine leistungsstarke Version bieten tolerante, portable binäre Serialisierung. Wenn Ihre Daten bereits serialisiert sind ... Ich frage mich, ob es an der Zeit ist, die Spur zu ändern? Verwenden Sie die alte Assembly, um die Daten zu deserialisieren, und wechseln Sie zu einer robusteren Serialisierungsstrategie.

    
Marc Gravell 23.04.2009 08:23
quelle
1

Ich empfehle, niemals die eingebauten Serialisierungen für Ihren persistenten Speicher zu verwenden. Schreiben Sie immer Ihre eigenen, wenn Sie aus irgendeinem anderen Grund irgendwann in der Zukunft Ihre Dateiformate aus einer anderen Sprache lesen und schreiben müssen.

    
Joshua 10.11.2009 16:14
quelle

Tags und Links