C # BinaryFormatter - Deserialize mit dem Objekt in einem anderen Namespace

8

Vor kurzem haben wir einen Teil unseres Codes in eine andere Projektbibliothek verschoben.

Leider wurden diese Daten mit einem BinaryFormatter in die Datenbank serialisiert (frag mich nicht, warum, ich weiß es nicht und ich hasse diese Idee).

Jetzt bin ich dafür verantwortlich, ein Update-Tool zu erstellen, das die Datenbank aktualisiert (Das Tool wird automatisch von unserer Software gestartet, wenn es eine Datenbank erkennt, die Updates basierend auf der Version benötigt):

  1. Erstellen Sie neue Spalten
  2. Deserialize die binäre Spalte
  3. Schreiben Sie die deserialisierten Spalten in die neue Spalte
  4. Löschen Sie die alten binären Spalten

Mein Problem ist, dass wenn ich versuche es zu deserialisieren, es mir sagt:

%Vor%

Aber diese Versammlung existiert nicht mehr. Ich habe kein Problem, diese Klasse in mein "Updater" -Projekt zu stellen, aber auf keinen Fall kann ich dieses alte Projekt behalten, nur um diese Datei zu enthalten.

Gibt es eine Möglichkeit, dem BinaryFormatter anzugeben, dass er den Stream, den er mit einer bestimmten Klasse empfängt, deserialisieren muss?

Oder sagen Sie, dass die Assembly umbenannt wurde, oder ???

    
J4N 21.10.2013, 08:59
quelle

3 Antworten

2

Tatsächlich glaube ich, dass ich selbst die Lösung gefunden habe.

Wir können dem binären Formatierer eine SerializationBinder geben, die es uns erlaubt, eine Klasse, die wir im Stream gefunden haben, manuell aufzulösen.

Weitere Informationen hier

    
J4N 21.10.2013, 09:25
quelle
4

Um zu sagen, dass sich der Typ zwischen Assemblys verschoben hat (der alte Name und der Namespace bleiben jedoch erhalten), können Sie manchmal (in der alten Assembly) [assembly:TypeForwardedTo(typeof(TheType))] verwenden. Das "manchmal" hier ist, weil Sie typeof verwenden müssen, was bedeutet, dass Sie einen Verweis von der alten Assembly auf die neue Assembly haben müssen, was nicht immer möglich ist - aber oft ist (besonders wenn Sie einen Typ von einer UI-Ebene in eine POCO / DTO-Ebene verschieben, da die Benutzeroberfläche normalerweise auf POCO / DTO verweist).

Wenn Sie jedoch den Typ des geänderten Namespaces umbenannt haben, müssen Sie ein benutzerdefiniertes "Binder" schreiben ( siehe hier ).

Es sollte beachtet werden, dass BinaryFormatter inhärent ein typbasierter Serializer ist und Sie immer eine Menge Probleme bekommen, wenn Sie den Code versionieren oder refaktorieren. Wenn der Typ nicht "einmal schreiben, dann nie ändern" lautet, würde ich stark vorschlagen, etwas flexibleres zu verwenden - das ist zB contract basierend statt type basierend. Grundsätzlich ist alles andere als BinaryFormatter (oder NetDataContractSerializer ): alle XmlSerializer , DataContractSerializer , protobuf-net, Json.NET usw. sind alle in Ordnung, und ist es egal dass Sie einen Typ verschoben oder umbenannt haben.

    
Marc Gravell 21.10.2013 09:22
quelle
0

Ich bin kürzlich selbst auf dieses Thema gestoßen und würde gerne veröffentlichen, wie ich es geschafft habe, das zu umgehen. Serialize das Objekt pro normal den Schlüssel zu allem ist, wenn die binaryformatter Deserialisierung Sie können eine Sammelmappe verwenden. Mit der unten abgebildeten Mappe habe ich die MSDN-Lösung vereinfacht. Alles, was Sie tun müssen, ist, die Versionierung der Assembly, die Sie verwenden, zusammen mit dem Klassennamen zurückzugeben.

%Vor%     
levon 26.11.2017 19:46
quelle

Tags und Links