BinaryFormatter-Ausnahme

8

Ich versuche, ein Objektdiagramm von einem Serverprozess zu einem Client zu verschieben. Und es funktioniert. Zumindest funktioniert es, wenn sowohl der Client als auch der Server auf meiner virtuellen Dev-Maschine sind. Es funktioniert auch, wenn ich den Server auf meinem Basiscomputer (Client auf Devvm) ausführe.

Es funktioniert jedoch nicht mehr, wenn ich den Server auf meinem Media Center-PC starte. Die Ausnahme ist:

  

Der Binärstream '0' enthält keinen gültigen BinaryHeader. Mögliche Ursachen sind ungültige Stream- oder Objektversionsänderungen zwischen Serialisierung und Deserialisierung.

Alle drei PCs sind x64 Windows 7 Maschinen. Ich benutze TCPClient und TCPListener zusammen mit der Klasse BinaryFormatter , um das Heavy Lifting durchzuführen.

Die übertragenen Daten werden mit einem standardmäßigen FileStream -Objekt aus einer Datei gelesen.

Wenn ich auf der Client-Seite die Puffer in eine Datei serialisiere, scheinen sich die Inhalte (nach BeyondCompare) tatsächlich zu unterscheiden?!?

Alle String-Eigenschaften für meine Objekte sind in den Settern Base64-codiert und in den Gettern dekodiert.

Ich kann Code schreiben, aber ich bin mir nicht sicher, wo der Problembereich liegt? Irgendwelche Ideen?

    
6footunder 10.04.2011, 05:02
quelle

1 Antwort

1

Update: Ich habe dieses Problem scheinbar gelöst. Ich hatte einen Haltepunkt, wo der Client die Serverantwort

gelesen hat %Vor%

und bemerkte, dass weniger Bytes vom "Problem" -Server gelesen wurden. Nach einem schnellen Google fand ich diesen Artikel Ссылка Dave Murray schlägt vor:

  

Es gibt mehrere Möglichkeiten, damit umzugehen   eleganter. Wenn du nicht bist   Planung der Wiederverwendung der Verbindung für   alles andere, das einfachste ist was   Nobugz schlägt vor. Wenn der Server ist   Sende Daten, habe es Close ()   Es ist das Ende der Verbindung. Wenn das   Der Client hat alle zuvor gesendeten Daten gelesen   Der Close, Read beginnt mit der Rückkehr   0, an diesem Punkt kennen Sie den Server   plant nichts zu senden   sonst.

Also habe ich meinen Code von einem einzigen Lesevorgang auf:

aktualisiert %Vor%

und habe meinen Servercode aktualisiert, um die Verbindung gemäß dem Beitrag zu schließen. Und nach dem Kommentar von @leppie kann ich wahrscheinlich meine Base64-Wrapped-Eigenschaften entfernen ...

    
6footunder 10.04.2011, 06:41
quelle