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?
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 ...
Tags und Links .net c# serialization exception binaryformatter