[Serialisierung] [Mal wieder :(] Serialisieren in Benutzerdefinierten Klassenstrukturen
-
Hi Zusammen,
ich habe ein kleines Problem mit meinem Verständnis der Serialisierung von
Daten: Ich habe hier eine Datenstruktur (Liste) vorliegen und speichere in
dieser Liste Daten vom Typ "Person". Wenn ich nun eine Liste aus Personen
Serialisieren möchte, wo muss dann der Aufruf von Serialize erfolgen?
Wie soll ich das ganze an das Archiv übergeben?
Muss ich die Person auch Serialisierbar machen?Danke im Voraus,
Khadgar
-
Also du möchtest eine Liste von Personen Speichern. Jede einzelne Person wird in einer Klasse "CPerson" gespeichert.
1. Die Klasse die du Speichern möchtest (CPerson) muß von CObject erben
class CPerson : public CObject
2. Diese Klasse braucht folgendes MACRO in der Header Datei
private: DECLARE_SERIAL(CPerson)
3. Global vor dem Konstruktor der Klasse (in der cpp Datei) schreibst du folgendes Macro
IMPLEMENT_SERIAL(CPerson,CObject,1)
4. Die Klasse bekommt noch folgende Funktion
void CPerson::Serialize(CArchive &ar) { if(ar.IsStoring())//Speichern { ar << m_vorname << m_nachname; //hier werden alle Eigenschaften der Klasse angeführt, //die man speichern will } else //Laden { ar >> m_vorname >> m_nachname; //hier werden die selben Eigenschaften angeführ wie //beim speichern. Nur der Oberator wird ausgetauscht } }
5. In der Document Klasse wird dann das speichern einfach übergeben. Hier die Funktion
void CTestSpeichernDoc::Serialize(CArchive& ar) { m_array->Serialize(ar); //m_array ist ein Zeiger auf ein CObArray (siehe unten) }
Das waren die fünf Schritte zum Speichern
jetzt kommt noch das Array in dem du deine Personen speicherst:
In der Document Klasse erstellst du ein neues Objekt (die steuert nämlich das Speichern)
public: CObArray *m_array;
Diese Klasse kann jede Andere Klasse verwalten die vom CObject abgeleitet wurde.
Dem CObArray kann ich nur Zeiger übergeben. Das heißt, ich muß jeden CPerson-Zeiger extra mit new erzeugen, damit der Zeiger seine Gültigkeit behält.
CPerson *person = new Person(); m_array->Add(CPerson);
Erst wenn ich den Zeiger wieder von meinem CObArray entfernt habe, dann darf ich denn Zeiger auf das Personen-Objekt löschen.
Beim herausholen aus dem CObArray muß ich auf den CPerson* casten, weil das CObArray glaubt, das es einen Zeiger auf eine CObject-Klasse beinhaltet.//herausholen CPerson *person = (CPerson*)GetDocument()->m_array->GetAt(0); //aus dem CObArray entfernen GetDocument()->m_array->RemoveAt(0); //speicher freigeben delete person;
Im kurzen:
1. im Document wird in der Funktion Serialize() der Auftrag gegeben das sich das CObArray
(m_array) speichern soll.
2. Das CObArray verwaltet die CPerson Klassen und sagt das sie sich speichern sollen
3. In der Klasse CPerson wird die Funktion Serialize() aufgerufen und die angegebenen
Eigenschaften werden gespeichert.Ok, probiers einmal aus.
MFG
SIGIPS: ICH hab leider keine zeit gehabt die Codeschnipsel zu überprüfen aber es müßte passen
-
Noch was!
GetDocument()->SetModifiedFlag();
Wenn du diese Funktion aufrufst dann erinnert dich das Programm vorm beenden daran, das du noch nicht gespeichert hast.
Also dort wo deine Daten verändert werden,
dort sollte auch diese Zeile stehen.TSCHAU, SIGI
-
Danke BigSigi für deine ausführliche Hilfe, den Sourcecode und vor allem die
ausführlichen Kommentare!!!Ich werds sobald wie möglich ausprobieren und - wenn ich darf - mich bei
weiteren Fragen betreffend der Realisierung nochmals bei dir melden.
-
In der FAQ steht ja nicht so viel über das serialisieren!
cu, sourcetipper