Seite 1 von 1
Objekte und deren Baumstruktur serialisieren
Verfasst: 26. Dezember 2008 16:46
von gentlesea
Hallo Forum,
ich habe eine Klasse geschrieben, von der es Objekte gibt, die in einer Hierarchie angeordnet sind. Diese möchte ich serialisieren. Dazu benutze ich QDataStream.
In meiner Klasse habe ich den folgenden Operator zum Speichern implementiert.
Code: Alles auswählen
QDataStream& operator<<(QDataStream &r_QDataStream, const MeineKlasse &r_QMeineKlasse)
Den dazugehörigen Operator zum Laden gibt es auch.
Code: Alles auswählen
QDataStream& operator>>(QDataStream &r_QDataStream, MeineKlasse &r_MeineKlasse)
In den Operatoren werden die Klassen in Ihre Bestandteile zerlegt. Klappt soweit prima. Nur gibt es in der Klasse jeweils einen Zeiger, der auf das Vaterobjekt verweist.
Wie bilde ich vernünftigerweise diese Baumstruktur beim Serialisieren ab? Die Zeiger werden sicherlich nach dem Laden nicht mehr gültig sein, oder etwa doch? Bin dankbar für Anregungen.
Verfasst: 26. Dezember 2008 20:01
von franzf
Du könntest beim serialisieren eindeutige IDs mit abspeichern. Jedes Objekt erhält seine eigene und die aufs parent.
Beim Einlesen erzeugst du der Reihe nach Objekte mit den Daten. Nun speicherst du in einer Map Pointer-ID-Paare. Über diese Map kannst du dann später die IDS in parents umwandlen.
Setzt voraus, dass du eine Methode setParent hast, mit der du dann nachher auch ne ordentliche Baumstruktur hinbekommst
Grüße
Franz
Attribute der abgeleiteten Klasse
Verfasst: 27. Dezember 2008 12:16
von gentlesea
Eine gute Idee, vielen Dank. Das habe ich jetzt auch so realisiert. Bin derzeit noch bei einer anderen Fragestellung. Wenn ich eine abgeleitete Klasse serialisieren will, muss ich dann die Attribute der Oberklasse auch in der abgeleiteten Klasse serialisieren oder reicht es, wenn die Oberklasse auch die 4 Operatoren überladen bekommt?
Irgendetwas läuft nämlich bei meiner abgeleiteten Klasse noch schief.
Code: Alles auswählen
QDataStream& operator<<(QDataStream &r_QDataStream, const CWeightedVector &r_CWeightedVector)
{
for (int nCurrentValue = 0; nCurrentValue < 4; nCurrentValue++)
{
r_QDataStream << (qreal) r_CWeightedVector.value_[nCurrentValue];
}
for (int nCurrentValue = 0; nCurrentValue < 3; nCurrentValue++)
{
r_QDataStream << (qreal) r_CWeightedVector.texcoord_[nCurrentValue];
}
for (int nCurrentValue = 0; nCurrentValue < 4; nCurrentValue++)
{
r_QDataStream << (qreal) r_CWeightedVector.color_[nCurrentValue];
}
r_QDataStream
<< (qint32) MAXIMUM_JOINTS;
for (int nCurrentCopy = 0; nCurrentCopy < MAXIMUM_JOINTS; nCurrentCopy++)
{
r_QDataStream << (qreal) r_CWeightedVector.m_fArrayOfVertexWeights[nCurrentCopy];
}
r_QDataStream
<< (qint32) r_CWeightedVector.m_QListOfIntOfScatterpoints.count();
for (int nCurrentCopy = 0; nCurrentCopy < r_CWeightedVector.m_QListOfIntOfScatterpoints.count(); nCurrentCopy++)
{
r_QDataStream << (qint32) r_CWeightedVector.m_QListOfIntOfScatterpoints.at(nCurrentCopy);
}
return r_QDataStream;
}
QDataStream& operator>>(QDataStream &r_QDataStream, CWeightedVector &r_CWeightedVector)
{
qint32 qint32Temp;
qreal qrealTemp;
r_CWeightedVector.setAsCalculated(true);
r_CWeightedVector.setAsLocked(true);
for (int nCurrentValue = 0; nCurrentValue < 4; nCurrentValue++)
{
r_QDataStream >> qrealTemp;
r_CWeightedVector.value_[nCurrentValue] = qrealTemp;
}
for (int nCurrentValue = 0; nCurrentValue < 3; nCurrentValue++)
{
r_QDataStream >> qrealTemp;
r_CWeightedVector.texcoord_[nCurrentValue] = qrealTemp;
}
for (int nCurrentValue = 0; nCurrentValue < 4; nCurrentValue++)
{
r_QDataStream >> qrealTemp;
r_CWeightedVector.color_[nCurrentValue] = qrealTemp;
}
r_QDataStream >> qint32Temp; // MAXIMUM_JOINTS
for (int nCurrentCopy = 0; nCurrentCopy < qint32Temp; nCurrentCopy++)
{
r_QDataStream >> qrealTemp;
r_CWeightedVector.m_fArrayOfVertexWeights[nCurrentCopy] = qrealTemp;
}
r_QDataStream >> qint32Temp; // number of scatterpoints
for (int nCurrentCopy = 0; nCurrentCopy < qint32Temp; nCurrentCopy++)
{
r_QDataStream >> qint32Temp;
r_CWeightedVector.m_QListOfIntOfScatterpoints.append(qint32Temp);
}
return r_QDataStream;
}
MAXIMUM_JOINTS ist schon beim zweiten Objekt dieser Klasse beim Einlesen nicht mehr der erwartete Wert. Sieht jemand den Fehler?