2012-10-26 9 views
5

nicht finden Ich serialisieren einige Daten wie Felder und benutzerdefinierte Klasse, um ein Binärdaten (Byte-Array) zu erstellen.Deserialisierung Ausnahme: Konnte Assembly

Dann möchte ich Deserialize es zurück von Binärdaten zu Feldern und Klasse.

Aber ich bekomme eine Ausnahme. Es würde alles gut funktionieren, wenn diese beiden Methoden in derselben Baugruppe stattfinden würden - aber nicht.

Ich mache Serialisierung in einem Assambly, und die Deserialisierung in einem anderen. Und das ist der Ausspruch auch zu sagen: Unable to find assembly 'MyAssamblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

HINWEIS 1: Ich habe keine Probleme mit dem Zurückholen der Felder, nur die Klassen verursacht sie.

HINWEIS 2: Ich habe die gleiche Klasse in beiden Baugruppen.

+0

K ... Kontext; sollten wir davon ausgehen, dass Sie BinaryFormatter verwenden? Der Typ, den Sie serialisiert haben: Ist das in einer Assembly, auf die beide Projekte verweisen? Versehen Sie versehentlich mehr Daten als erwartet über Ereignisse? (das passiert wirklich oft) –

Antwort

6

Anmerkung 2: Ich habe diese gleiche Klasse in beiden No

Sie dies nicht tun Baugruppen. Zumindest nicht in Bezug auf die Laufzeit. Sie haben zwei verschiedene Typen, die zufällig denselben Namen haben. Ein Typ ist definiert durch seine Montage. So "SomeType in AssemblyA" ist völlig anders als "SomeType in AssemblyB", auch wenn sie zufällig aus der gleichen Quelldatei kompiliert wurden.

BinaryFormatter arbeitet mit Typinformationen, so dass dies nicht funktioniert. Eine Option wäre, den Typ in eine Bibliotheksdll zu verschieben, auf die beide anderen Projekte verweisen - dann wird sie nur einmal definiert und sie wird glücklich sein.

Eine weitere Option besteht darin, mit einem Contract-basierten Serializer (statt einem typbasierten Serializer) zu arbeiten. Dies bedeutet, dass "Klassen, die ähnlich aussehen", in Ordnung sind, auch wenn sie sich in verschiedenen Assemblys befinden (und möglicherweise unterschiedliche Quellen haben, solange sie "ähnlich genug" sind). Beispiele für geeignete Serialisierer hierfür wären (plus ein paar andere) XmlSerializer, DataContractSerializer (aber nicht NetDataContractSerializer), JavaScriptSerializer oder protobuf-net, wenn Sie eine dichte rohe Binärdatei wünschen.

+0

Ja, ich benutze BinaryFormatter. Ich würde gerne mit Ihrer ersten Option gehen. Also muss ich ein neues Projekt erstellen und es zu den beiden anderen Projekten hinzufügen? Habe ich recht? –

+1

Fügen Sie in der Projektmappe ein neues Projekt hinzu - wählen Sie "Bibliothek". Nun lege die Klasse dorthin und entferne sie von den anderen zwei Orten. Schließlich, für die beiden ursprünglichen Projekte: Referenzen, Verweis hinzufügen ... Wählen Sie das neue Bibliotheksprojekt, das Sie gerade erstellt haben. –

+0

Das habe ich gerade gemacht! Thxa viel Kumpel. Ich werde Sie wissen lassen, ob es funktioniert (aber ich weiß es wird :)). –

2

Alle Assemblys, die Klassen in der Klassenhierarchie des Objekts enthalten, das Sie deserialisieren, müssen in der Anwendung vorhanden sein, in der Sie diese Deserialisierung durchführen. Sie können entweder explizit referenziert werden (wenn Sie für diese Klassen eine Kompilierungssicherheit benötigen) oder nur im Ordner bin der Anwendung platziert werden, damit sie zur Laufzeit aufgelöst werden können. Wenn sie nicht explizit referenziert werden, müssen Sie die Reflektion verwenden, um die Werte aus der deserialisierten Instanz zu lesen.

Verwandte Themen