Deserialisieren von byte array to object
-
Hallo erstmal,
ich bräucht ein wenig Hilfe in .Net. Ich würde gerne ein byte array in ein Objekt deserialieren. In guter alter C++ Manier würde ich gerne sowas machen wie ...
struct strReceive { int a; // 4 byte char b; // 1 byte short c; // 2 byte }; void Foo() { BYTE abReceive[7]; strReceive* pstrReceive; LeseSocketBuffer(abReceive); // die Funktion füllt halt den buffer mit werten ... // bsp.: // abReceive[0] = 0 // abReceive[1] = 0 // abReceive[2] = 0 // abReceive[3] = 5 // abReceive[4] = 0 // abReceive[5] = 0 // abReceive[6] = 0 // abReceive[7] = 10 pstrReceive = (strReceive*)abReceive // Zuweisung zu den Variablen ist nur für die Überprüfung der // Werte. Hauptsache pstrReceive ist gefüllt und als "Objekt" // nutzbar. int ZahlA = pstrReceive->a; char CharB = pstrReceive->b; short ShortC = pstrReceive->c; }
... Am Ende hätte ich halt ein Objekt auf das von pstrReceive gezeigt wird. Ich hab mir schon mal ...
http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Byte-array-to-object.html
... und daraufhin ...
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.deserialize%28VS.71%29.aspx... angeschaut. Ich weiss gerade nur nicht, ob ich da mit dem BinaryFormater auf dem richtigen Weg bin. Ich habe halt mehrere unterschiedliche Strukturtypen die gefüllt werden müssten, je nach dem welchen Strukturtypen ich denn gerade in dem Buffer erwarte (einmal kann der Buffer mit Werten des Typs "struct strReceive" gefüllt sein, ein ander mal mit "struct strReceive2", "struct strReceive3", usw.).
Am Ende hätte ich halt gerne eine Klasse bei der ich sowas machen könnte ...struct strReceive = MyBinaryConverter(typeof(strReceive), buffer);
Da ich gerade im Moment noch nicht vollständig verstanden habe, wie ich diese Klasse "BinaryFormatter" benutze, wollte ich mal fragen, ob ich da voll auf dem Holzweg bin und wenn es der richtige Weg sein sollte, wollte ich nachfragen, wie das mit dem "ISurrogateSelector" und dem "StreamingContext" funktioniert, da ich aus der MSDN Beschreibung gerad nicht schlau werde.
Wenn mir niemand mit genaueren Erklärungen zum BinaryFormatter weiterhelfen kann, wäre für mich aber schon mal gut zu wissen, ob ich da in die richtige Richtung gegoogelt habe und weiter nachforschen muss oder nicht
Ich hoffe das ganze war verständlich genug ausgedrückt. Im allerschlimmsten Notfall bau ich mir auch noch eine C++/native Klasse ... aber sowas muss doch auch mit .Net zu realisieren sein
Gruß
GastDeSerialize
-
Schau dir mal die Klasse BitConverter an (besonders die Methoden GetBytes sowie die To...).
Der BinaryFormatter wäre dann empfehlenswert, wenn du die Daten extern (z.B. als Datei) ablegen willst. Ein weiterer Vorteil ist, daß die Member und dessen Datentypen automatisch beim Deserialisieren erkannt werden.Die Frage ist jetzt aber, woher hast du das Byte-Array? Wenn von extern vorgegeben, dann mußt du es auch entsprechend Byte für Byte deserialisieren.
Ein anderes Stichwort wäre dann noch Marshall.PtrToStructure, s.a. http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/
-
Ahhh ... hab 1000 Dank. Der Link zu dem Thema Marshall.PtrToStructure scheint für mich genau das richtige zu sein.