Gleiche Funktion zum schreiben und lesen in Stream
-
Scarabol schrieb:
Die Serialize Funktion muss ich aber doch auch selbst schreiben oder?
Gibt es das nicht schon vorgekaut? Dachte das währe ein "Standardproblem"?
Da C++ keine Reflection hat, musst du die einzelnen Member manuell serialisieren. Es gibt nämlich keine Möglichkeit, von einem Objekt die Eigenschaften zu serialisieren, ohne diese zu kennen.
Allerdings helfen dir Bibliotheken wie Boost.Serialization enorm bei dieser Aufgabe.
-
Also brauche ich für jedes Objekt das ich serialisieren möchte eine eigene Funktion?
MfG
Scarabol
-
Für eigene Objekte, ja. Dinge wie
intoderstd::vectorsind schon implementiert.
-
Nexus schrieb:
Für eigene Objekte, ja. Dinge wie
intoderstd::vectorsind schon implementiert.Wo bzw. in welcher Funktion sind diese schon implementiert?
MfG
Scarabol
-
In der Implementierung von Boost.Serialization. Wo genau, weiss ich nicht, das ist aber auch unwichtig.
-
Kann ich den Operator nicht zur Laufzeit überladen?
MfG
Scarabol
-
Drück dich klarer aus. Von welchem Operator sprichst du? Warum willst du diesen überladen? Und wieso erst zur Laufzeit?
-
Mal so eingeworfen: Gibts dazu noch keinen Artikel? Zu boost::serialization? Wäre was tolles :). Sorry für offtopic.
rya.
-
Hi Leute,
ich hab mir jetzt einfach eine neu Klasse erstellt, die einen stringstream kapselt und die beiden Operatoren >> << hat. Bei << wird halt immer noch ein Trennzeichen mit in den String geschrieben und bei >> wird das Trennzeichen in eine Variable ausgelesen, aber sonst nicht weiter beachtet.
Danke für euere Hilfe.
Ich würde gerne Netzwerkpakete definieren, für die ich beispielsweise eine extra Klasse oder ein Struct anlege, sodass ich bei gemeinsamer Verwendung auf der Client und der Server Seite immer die gleichen Pakete habe.
Was ich bisher weiß ist, dass ich dann für jedes Paket eine eigene serialize() Funktion schreiben müsste in der nur wieder alle Variablen der Klasse aufgelistet sind und die dann hintereinanderweg in einen stringstream geschrieben werden. Gibt es eine Möglichkeit diesen Schritt zu umgehen, dass die Klasse selbsttätig alle ihre Member in einen stream schreibt, oder andere Methoden, oder Ideen?MfG
Scarabol
-
Scarabol schrieb:
void send(char *buffer, int var1, long var2, char var3, int var4) { istringstream stream; // [Makierung] stream << var1 << ","; stream << var2 << ","; stream << var3 << ","; stream << var4 << ","; // [/Makierung] buffer = stream.c_str(); }Also diese Funktion macht ja mal so gar nicht, was du willst. Zuerst mal hat ein istringstream keinen operator<<, du willst einen ostringstream oder einfach einen stringstream. Dann hat stringstream keine Methode c_str(), sondern nur str(), also willst du eher ein stream.str().c_str() (das kann man unter die Kategorie Pseudocode fallen lassen). Das funktioniert aber auch nicht, weil c_str() einen const char* zurückgibt, keinen char*. Selbst wenn diese Zuweisung klappen würde, würde der Code immer noch nicht das von dir gewünschte Verhalten zeigen, weil du den Zeiger buffer per value und nicht per reference überweist, d. h. von der letzten Zuweisung bekommt außerhalb der Funktion keiner was mit. Selbst wenn du den Zeiger per reference übergeben würdest, wäre das Verhalten des Codes höchstwahrscheinlich undefiniert, weil stream beim Verlassen der Funktion zerstört wird.