[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
    SIGI

    PS: 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


Anmelden zum Antworten