Entwickler-Ecke

Netzwerk - Serialisieren und Deserialisieren


paddy14 - Di 17.05.11 16:32
Titel: Serialisieren und Deserialisieren
Guten Tag Forum,

habe da ein kleines Prob mit dem Serialisieren und Deserialisieren.

hier der Code vom Server:

C#-Quelltext
1:
2:
3:
4:
5:
serial s = new serial();
s.id = 1;
s.nachricht = "foo";
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, s);





und hier von Client:

C#-Quelltext
1:
2:
3:
4:
Thread.Sleep(500);
BinaryFormatter formatter = new BinaryFormatter();
s = (serial)formatter.Deserialize(stream);
richTextBox1.Invoke(new MethodInvoker(ausgabe));




dabei bekomme ich folgende Exception, kann einer was damit anfangen und mir bitte erklären was ich falsch mache.
Exception: Die Assembly "server_serialisieren, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" kann nicht gefunden werden.


Wenn ich das mit MemoryStream mache

C#-Quelltext
1:
2:
3:
4:
5:
6:
Thread.Sleep(500);               
MemoryStream mem = new MemoryStream(lesen);
BinaryFormatter formatter = new BinaryFormatter();                
serial s = (serial)formatter.Deserialize(stream);
mem.close();                
richTextBox1.Invoke(new MethodInvoker(ausgabe));


dann bekomme ich diese Exception.
Der binäre Stream "0" enthält keinen gültigen BinaryHeader. Möglicherweise ist der Stream ungültig oder die Objektversion wurde zwischen der Serialisierung und der Deserialisierung geändert.

Danke


Th69 - Di 17.05.11 17:31

Hallo,

verwenden Client und Server denn dieselbe Assemly (in der dieser Typ 'serial' definiert ist)? s.a. http://stackoverflow.com/questions/2120055/binaryformatter-deserialize-gives-serializationexception (es reicht also nicht, einfach nur die Klasse in beiden Projekten zu verwenden)

Andere Lösung mittels der System.Runtime.Serialization.SerializationBinder-Klasse: http://spazzarama.wordpress.com/2009/06/25/binary-deserialize-unable-to-find-assembly/


paddy14 - Di 17.05.11 21:06

Nur eine kurze Frage noch dazu.

Wie binde ich eig die selbe Klasse in einem anderen Projekt ein, habe da was gelesen das das mit einer dll datei geht.

Stimmt das???

mfg patrick


Ralf Jansen - Di 17.05.11 21:09

Zitat:
Der binäre Stream "0" enthält keinen gültigen BinaryHeader. Möglicherweise ist der Stream ungültig oder die Objektversion wurde zwischen der Serialisierung und der Deserialisierung geändert


Willst du uns sagen du hast testweise in einem Prozess mal in einen Stream serialisiert und sofort wieder aus diesem Stream deserialisiert? Dann solltest du zwichenzeitlich mal den Streampointer des Streams wieder auf den Anfang setzen. Durch das serialisieren ist die aktuelle Position im Stream ans Ende der serialisierten Bytefolge gerutscht. Wenn du dann deserialisierst wirst du ab dort natürlich nichts mehr finden. Also zwischenzeitlich die Position [http://msdn.microsoft.com/de-de/library/system.io.memorystream.position.aspx] Property wieder an die Stelle des Stream setzen an der du angefangen hast zu serialisieren(Wenn der Stream vorher leer war also auf Position = 0 setzen.)


Ralf Jansen - Di 17.05.11 21:14

Zitat:
Wie binde ich eig die selbe Klasse in einem anderen Projekt ein, habe da was gelesen das das mit einer dll datei geht.


Du brauchst eine Referenz auf die Assembly in der die Klasse steckt. Das muss aber nicht zwingend eine Dll sein kann auch eine EXE sein. Wenn du eine Klasse in zwei Anwendungen brauchst ist es aber definitiv am geschicksten sie in einer 3.ten Assembly vorzuhalten die von den beiden Anwendungen benutzt wird.


paddy14 - Di 17.05.11 21:34

Also das was ich darüber weiß und ich weiß nicht ob ich das richtig verstanden habe ist, ich erzeuge z.B. in meinem Server eine DLL und und erstelle einen Verweis auch meinem Client und dann sollte das die selbe Klasse sein.

Das brauche ich ja auch damit die ganze Sache geht oder nicht?


paddy14 - Di 17.05.11 22:30

Alles klar ich habe es hinbekommen, einfach ne DLL erzeugt und dann ins andere Projekt eingebunden und schon ging es.

Ich sag ja, kaum macht man es richtig geht es :D.

Schönen Abend euch noch und vielen dank für die Hinweise.


Ralf Jansen - Di 17.05.11 22:30

Häh? Wenn du meinst das die Dll die du im Server benutzt (also auf die der Serverprozess eine Referenz hat) auch vom Clientprozess benutzt wird(der Clientprozess hat ebenfalls eine Referenz auf diese Dll) dann Ja. Das wäre die Grundlage dafür das man über einen Typen aus der Dll zwischen diesen beiden Prozessen per BinaryFormatter kommunizieren kann.