Serialisierung von Daten
-
Hallo,
ich brauche eine sehr einfaceh und nicht besonders sichere Methode (zum testen) um ein object der Form
struct test { bool var1; long var2; size_t length; unsigned char* data; };zu serialisieren (wird später über einen socket geschickt...).
Bevor der pointer dazu kam konnte ich ein einfaches memcpy machen. Jetzt geht das nicht mehr. Stehe gerade auf der Leitung.Danke für nen Denkanstoß
-
Würde es für dich reichen, das als Text-Repräsentation zu bekommen? Und dem Fall ist das folgende eventuell schon ausreichend:
stringstream sout; sout<<x.var1<<' '<<x.var2<<' '<<x.length<<' '<<x.data; return sout.getbuffer();//bei dem Befehl bin ich etwas unsicherAnsonsten benötigst du wohl statt des "einfachen" memcpy() ein doppeltes - erst die intern gespeicherten Daten (var1, var2, length) in den Ausgabespeicher schreiben, dahinter dann den Inhalt von *data.
-
Danke dass mit dem stringstream hab ich mir auch überlegt, aber ich denke data wird dann bis zur nächsten '\0' eingelesen. Gibt es denn keinen binary_stream oder sowas?
Muss dann wohl mit dem memcpy rumprobieren. Dachte die Zeiten wären in c++ vorbei...
-
Funktioniert soweit. Ist natürlich nicht schön...
void serialize(unsigned char*& serializedData, size_t& dataLength) const { dataLength = sizeof(test) + length; serializedData = new unsigned char[dataLength]; memcpy(serializedData, this, sizeof(test)); memcpy(serializedData + sizeof(test), data, length); } void deserialize(const unsigned char* serializedData, size_t dataLength) { assert(data == NULL); memcpy(this, serializedData, sizeof(test)); data = new unsigned char[this->length]; memcpy(data, serializedData + sizeof(test), this->length); }
-
templäd schrieb:
Funktioniert soweit. Ist natürlich nicht schön...
Es funktioniert auch nicht, denn er hat da nen Pointer auf nen String.
Gruß
-
Du musst deine Objekte selbst als ASCII serialisierbar machen.
Nur ein Beispiel:ostringstream os; os << "Typ: test" << end << var1 << endl << var2 << endl << length << endl << *data << endl;Und dann kannste das Ding raus hauen. Jedenfalls mußt du dir irgendwie ein Format ausdenken, das auf der anderen Seite wieder vernünftig geparst werden kann. Die andere Seite weiß z.B. das Typ Test 4 Attribute hat. Anhand der endl's kann er sie trennen und parsen.
Aber ich würde das ganze am besten als XML serialisieren, da man damit komplexere Strukturen bauen kann. Und dann würd ich mal langsam aber sicher auf std::string umsteigen.

-
templäd schrieb:
Gibt es denn keinen binary_stream
Sowas wäre ja coool

-
Freak_Coder schrieb:
templäd schrieb:
Gibt es denn keinen binary_stream
Sowas wäre ja coool

selber schreiben
Die STL ist flexibel genug, um dort eigene Stream-Klassen einzuarbeiten.