Assembly Independent Serialisierung in .NET

8

Ich benutze Serialisierung / DeSerialisierungstechnik. BinaryFormatter-Klasse. Jedes Mal, wenn eine neue Assembly erstellt wird, kann BinaryFormatter Binärdaten nicht deserialisieren, selbst wenn die Klassenstruktur identisch ist, aber die Assembly-Version unterscheidet sich. Ist es möglich, binären Puffer zu deserialisieren, ohne die Assemblyversion zu überprüfen, wenn die Klassenstruktur unverändert bleibt?

    
Martijn Pieters 22.08.2011, 21:51
quelle

3 Antworten

7

Versuchen Sie Folgendes:

%Vor%

Themenplakat hinzugefügt:

Ja, es funktioniert. Stellen Sie nur sicher, wenn irgendwelche Arten von System.Generic oder andere Bibliotheken in den Binärdaten vorhanden sind, dann müssen Sie sie ohne Änderungen weitergeben. "ResizableControls" - alter Name der Assembly-Bibliothek, "EntityLib" - neuer Name der Assembly. Auch die Versionsnummer soll auf Anfrage ersetzt werden.

%Vor%

Danke, es ist genau das, was ich brauchte.

    
Jacob Seleznev 22.08.2011, 23:07
quelle
6

Das ist inhärent mit BinaryFormatter . There sind einige fortgeschrittene Dinge, die Sie tun können, um es zu umgehen (mit Ersatzzeichen usw.), aber es ist nicht einfach und ich kann es wirklich nicht empfehlen.

Ich stark schlage vor, dass Sie sich einen Vertrag -basierten Serializer ansehen; zum Beispiel:

  • XmlSerializer
  • DataContractSerializer (aber nicht NetDataContractSerializer )
  • protobuf-net

(Ich bin gegenüber dem letzten voreingenommen, da es eine viel effizientere Ausgabe liefert und absichtlich einige mehr Versionierungsprobleme vermeidet)

In all diesen Fällen enthält der Datenspeicher (zumindest bei den Standardeinstellungen) keine irgendwelche Kenntnisse der Typen außer dem Vertrag, der durch die Namen oder wie angegeben impliziert wird (normalerweise in Attributen).

    
Marc Gravell 22.08.2011 21:57
quelle
1

Ich denke, das ist ein bekanntes Problem mit BinaryFormatter - hier ist eine mögliche Lösung Sie können steuern, welcher Typ mit einem SerializationBinder geladen werden soll - der Link enthält Code und ein Beispiel, wie Sie diesen (in fast allen .net-Sprachen) verwenden können

    
Carsten 22.08.2011 21:53
quelle