Objekte und deren Baumstruktur serialisieren

Alles rund um die Programmierung mit Qt
Antworten
gentlesea
Beiträge: 27
Registriert: 27. März 2008 10:30

Objekte und deren Baumstruktur serialisieren

Beitrag 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.

Code: Alles auswählen

MeineKlasse *m_pMeineKlasseParent;
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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
gentlesea
Beiträge: 27
Registriert: 27. März 2008 10:30

Attribute der abgeleiteten Klasse

Beitrag 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?
Antworten