Serialisierung von struct

9

Angenommen, ich habe eine Struktur, deren Memberwerte ich mit Winsock 2 über das Netzwerk an ein anderes System senden möchte. Ich benutze C ++ - Sprache.  Wie konvertiere ich es in char * unter Berücksichtigung, dass die Struktur vor dem Senden serialisiert werden muss und wie deserialize das char * in struct am anderen Ende? Ich habe Boost-Serialisierung als Vorschlag für ähnliche Fragen gefunden, aber kann jemand mit einem kleinen Code-Snippet sowohl für die Serialisierung als auch für die Deserialisierung veranschaulichen?

Diese Frage mag sehr einfach erscheinen, aber die anderen Antworten auf die verwandten Beiträge haben nicht viel geholfen.

    
Vigo 14.05.2013, 12:44
quelle

5 Antworten

14

Das folgende Beispiel zeigt eine einfache Möglichkeit, struct in char array zu serialisieren und zu serialisieren.

%Vor%     
Amith Chinthaka 30.12.2013 10:50
quelle
3

Sie können sich auch Protokollpuffer von Google ansehen, einer plattform- / sprachenunabhängigen Bibliothek zum Senden von Daten zwischen Hosts.

Allerdings wird das Paradigma dahin verlagert, zuerst das Protokoll zu schreiben und dann Ihre Datenstrukturen darin einzupassen. Der Vorteil davon ist jedoch, dass Ihre Softwarearchitektur so gut in einfache Datentypen passt.

    
Nick 14.05.2013 13:28
quelle
2

Sie können einfach

tun %Vor%

Es liegt an Ihnen, auf Endianess und Unterschiede in der Größe von int s und whatnot zu achten.

Beispiel:

%Vor%

Wenn Sie eine Socket-Bibliothek haben, die ihre Schnittstelle über C ++ iostreams verfügbar macht, brauchen Sie nicht einmal den stringstream.

    
rwols 14.05.2013 13:22
quelle
1

Ok, ich werde das Beispiel von der Boost-Website nehmen wie ich nicht verstehe, was du daraus nicht verstehen kannst.
Ich habe einige Kommentare und Änderungen dazu hinzugefügt, wie Sie über das Netzwerk übertragen können. Der Netzwerkcode selbst ist nicht hier. Sehen Sie sich dazu boost :: asio an.

> %Vor%     
mkaes 14.05.2013 13:13
quelle
0

Wenn Ihre Struktur POD ist, können Sie memcpy :

verwenden

::memcpy(data, &your_struct, sizeof(YourStruct)));

und umgekehrt an der Rezeption:

::memcpy(&your_struct, data, sizeof(YourStruct)));

Wo data ein char* ist. Vergiss nicht, dass du es zuordnen musst. Achte darauf, dass es groß genug ist und lösche es am Ende.

    
Arthur 14.05.2013 12:59
quelle