Seite 1 von 1

Objekte serialisieren

Verfasst: 23. August 2006 13:56
von Daniellus
Hallo Forum,

ich bin Student und befinde mich gerade seit knapp 3 Wochen im 2. Praxissemester.
Habe nun die Aufgabe bekommen meine Objekte portierbar zu machen.
Vorgefertigte Funktionen habe ich leider nicht gefunden.
Gibt es in Qt keine oder bin ich unfähig diese zu finden?
Kennt jmd. vielleicht einen Weg um dieses Problem zu lösen.

Ich benutze Qt 3.3.4

Bin für jede Antwort dankbar
MfG Daniellus

Verfasst: 23. August 2006 15:19
von Christian81
Was meinst Du mit 'portierbar'?
Qt kennt keine Klasse wie Serializable in Java, man muss es von Hand implementieren. QDataStream hilft Dir da evtl. weiter.

Verfasst: 23. August 2006 16:02
von Daniellus
Ja, mit portierbar ist genau das gemeint, was Java's "Serializable" tut.
QDataStream habe ich schon probiert ( label ist mein Objekt ):

QByteArray bytearray;
bytearray.setRawData(label, sizeof(label));
QDataStream datastream(bytearray, IO_WriteOnly);



setRawData() verlangt laut compiler ein const char* und kein Objekt.
In der Doku steht folgendes zu setRawData():

QMemArray<type> & QMemArray::setRawData ( const type * data, uint size )

Ich kann allerdings dieses <type> und const type* nicht interpretieren, da ich mit dem type noch nichts zu tun hatte.

Verfasst: 23. August 2006 16:08
von Christian81
Ich meinte damit dass Du für alle Klassen die Du serialisieren willst, eine Funktion schreiben sollst welche z.B. ein QDataStream mit allen Infos zurückliefert.
Aber was willst du überhaupt damit anfangen?

Verfasst: 23. August 2006 19:15
von Nassian
In Qt4 kannst ud Objekte als XML Serialisieren. Nur ob das das ist was du benötigst weiß ich nicht.

Verfasst: 24. August 2006 09:45
von Daniellus
Guten Morgen,

also mit XML kenn ich mich nicht aus...behalte es aber im Hinterkopf.

Diese Serialisierung brauch ich um Objekte, welche zu einem bestimmten Zeitpunkt einen bestimmten Zustand haben persistent zu machen, Sprich alle Daten aus dem Hauptspeicher ( transiente Daten ) auf die Platte legen
( persistente Daten ).

Wegen der Funktion:
Meinst du es so, das ich meine Objekte an die Funktion übergebe und die members einzeln in einen QDataStream schreibe und diesen als Rückgabewert in eine Datei Speichere?

Verfasst: 24. August 2006 09:50
von Christian81
Nein, Deine Obkjekte beinhalten eine Funktion serialize() welche die Daten des Objekts in einen QDataStream speichert welchen Du dann in ein File speichern kannst.

Verfasst: 24. August 2006 10:05
von BartSimpson
Iich würde dir ehr zu XML raten. Damit bist total unabhängig. Auch wenn der Aufwand etwas größer ist. Dafür biste denn aber an nix gebunden.:)

Verfasst: 24. August 2006 10:24
von Daniellus
Ja, du redest von Memberfunktionen.
So müsste ich ja für jede Klasse, die ich verwende eine Funktion
serialize() schreiben.

Und ich kann ja QTable nicht umbauen.

Es müsste doch möglich sein eine eigene Klasse zu schaffen und mit den entsprechenden überladenen Funktionen z.B. QTable table; QLable lable;
usw...zu speichern. Ich hätte dann aber nen Haufen überladener Funktionen...ob das so gut ist.
Na ja, also es gibt in Qt also keine Implementation zum Serialisieren von Objekten.
Wenn jmd eine gute Idee hat bitte posten, sonst werde ich mal meinen Hirnschmalz anstrengen und ne gute Lösung suchen, auch mit XML.

Verfasst: 24. August 2006 10:27
von Christian81
Und was ist das Problem einfach von QTable abzuleiten?

Verfasst: 24. August 2006 11:08
von Daniellus
Das verstehe ich jetzt nicht wirklich.
Wem soll ich QTable vererben.

Angenommen:
QTable table;
...
...
table.serialize();
//serialisiert Tabellenmerkmale wie Size,Background usw. mit dem Inhalt

Da brauch ich ne Funktion, die nen Member von QTable ist.
Wahrscheinlich meinst du aber was anderes, oder?

Verfasst: 24. August 2006 11:22
von Christian81
Daniellus hat geschrieben:Das verstehe ich jetzt nicht wirklich.
Wem soll ich QTable vererben.
class MyTable : public QTable vielleicht?

Verfasst: 24. August 2006 12:37
von Daniellus
Sag doch gleich das du das meinst... :wink:
Hab ich auch schon überlegt...passt leider nicht ganz, wenn ich da schon selber was baue, dann sollte es auch in Zukunft verwendet werden können.

Aber Trotzdem Danke.

Verfasst: 24. August 2006 12:46
von BartSimpson
Dann nimm doch besser Qt4. Da kannste denn deinem Datenmodell für Tabellen die Eigenschalft mitgeben.

Verfasst: 24. August 2006 17:00
von Archimedes
Daniellus hat geschrieben:Ja, mit portierbar ist genau das gemeint, was Java's "Serializable" tut.
QDataStream habe ich schon probiert ( label ist mein Objekt ):

QByteArray bytearray;
bytearray.setRawData(label, sizeof(label));
QDataStream datastream(bytearray, IO_WriteOnly);



setRawData() verlangt laut compiler ein const char* und kein Objekt.
In der Doku steht folgendes zu setRawData():

QMemArray<type> & QMemArray::setRawData ( const type * data, uint size )

Ich kann allerdings dieses <type> und const type* nicht interpretieren, da ich mit dem type noch nichts zu tun hatte.
QDataStream & operator<<(QDataStream &s, DeinObjekt & obj)
{
s.writeRawBytes((char *)&obj,sizeof(obj));
return s;
}