[Serialisierung]



  • Hi tag,
    Dank dir vielmals für die schnelle Antwort.
    Dass ich dem CArchive noch einen Flag übergeben muss wusste ich nicht, denn das
    war in dem anderen Beispiel auch nicht gegeben (*)
    Ich hab VC jetzt dank dir auf einen Fehler runter, jedoch beschwert er sich
    immer noch wie folgt:

    error C2678: binary '<<' : no operator defined which takes a left-hand operand
    of type 'class CArchive' (or there is no acceptable conversion)

    Der Sourcecode sieht mittlerweile so aus:

    CFile f(DATEINAME, CFile::modeReadWrite);
    CArchive a(&f, CArchive::store);
    a<<kontakte;
    

    Kann da jemand was mit Anfangen?

    * [url] Serialisierung - weitere Frage [/url]

    [edit: Und hier musste die richtige URL rein. Bis Heute wohl ein wenig
    durcheinander :D]

    [ Dieser Beitrag wurde am 10.07.2003 um 13:05 Uhr von Khadgar editiert. ]



  • [Ausversehen 2x gepostet]

    [ Dieser Beitrag wurde am 10.07.2003 um 13:03 Uhr von Khadgar editiert. ]



  • Hallo.

    Was für einen Typ hat eigentlich die Variable "kontakt"?

    Bye



  • Das Array "kontakte" enthält Objekte vom Typ "Kontakt".
    Diese Objekte habe ich mir selbst zusammengebaut und so wie es scheint bin
    ich momentan unfähig diese so zu casten, dass ich die irgendwie in das
    Archiv bekomme.

    Geht das irgendwie?
    Sollte ich doch auf einfache Datentypen zurückgreifen?



  • inline CArchive& operator<<(CArchive& ar, CKontakt& kontakt)
    {
    kontakt.Serialize(ar);
    return ar;
    }
    inline CArchive& operator>>(CArchive& ar, CKontakt& kontakt)
    {
    kontakt.Serialize(ar);
    return ar;
    }

    Und den Rest erledigst Du dann in CKontakt::Serialize 😉



  • Dank dir tag,
    aber wo muss der Code rein?
    [Edit] Und wo soll die CKontakt::serialize() herkommen? [/Edit]

    [ Dieser Beitrag wurde am 10.07.2003 um 21:17 Uhr von Khadgar editiert. ]



  • Naja, es sind zwei ganz normale Funktionen.
    Wenn es inline bleibt, dann alles in den Header, wenn es nicht inline bleibt, dann

    CArchive& operator<<(CArchive& ar, CKontakt& kontakt);
         CArchive& operator<<(CArchive& ar, CKontakt& kontakt);
    

    in den Header und

    CArchive& operator<<(CArchive& ar, CKontakt& kontakt)
    {
    kontakt.Serialize(ar);
    return ar;
    }
    CArchive& operator>>(CArchive& ar, CKontakt& kontakt)
    {
    kontakt.Serialize(ar);
    return ar;
    }
    

    in die CPP Datei.

    Die Funktion Serialize kannst Du dir selber erstellen:

    void CKontakt::Serialize(CArchive& ar)
    {
    if(ar.IsStoring())
    {
    // speichern
    }
    else
    {
    // laden
    }
    }
    

    Oder wenn du den Code zum Laden/Speichern direkt in die operatoren schreibst, dann kannst du natürlich auf Serialize verzichten.



  • Sehe ich das also richtig wenn ich die CKontakt von CArchive ableiten sollte und
    dann die Funktionen operator<< und operator>> überladen soll?
    Oder kommen die in meinen mainDlg? Oder in CKontakt ohne die Klasse von
    irgendwas abzuleiten?

    Sorry. Fragen über Fragen, aber ich verstehe deine Idee noch nicht so wirklich 😞
    Gruß,
    Khadgar



  • Nein, nicht von CArchive ableiten. Die Operatoren mit zwei Parametern machen ja gerade sowas überflüssig! Der erste Parameter ist immer die linke Seite von << (das Archiv), der zweite die rechte Seite von >> (der Kontakt). Der Operator macht in meinem Beispiel nun nichts anderes, als Serialize aufzurufen; man könnte natürlich die Speicherung und das Laden auch direkt in den operator schreiben, ohne Serialize 😉

    class CKontakt
    {
    public:
        CKontakt() : name("tag"), alter(19) {}
        void Serialize(CArchive& ar)
        {
            if(ar.IsStoring())
            {
                ar << name << alter;
            }
            else
            {
                ar >> name >> alter;
            }
        }
    private:
        CString name;
        int alter;
    };
    
    CArchive& operator<<(CArchive& ar, CKontakt& kontakt)
    {
        kontakt.Serialize(ar);
        return ar;
    }
    CArchive& operator>>(CArchive& ar, CKontakt& kontakt)
    {
        kontakt.Serialize(ar);
        return ar;
    }
    
    void foo()
    {
        CFile f("daten.dat", CFile::modeReadWrite);
        CArchive a(&f, CArchive::store);
    
        CKontakt k1;
        CKontakt k2;
    
        // Zuerst operator<< aufrufen, welcher Serialize aufruft
        a << k1;
        // Gleich Serialize aufrufen
        k2.Serialize(a);
    }
    


  • Ok,
    ich denke so langsam habe ich es 😃
    Ich kann das Array endlich persistent speichern *freu*

    Vielen Dank tag!!!

    [Edit]Mit welchem Tag muss ich das CArchive initialisieren um lesen zu können?
    Wie finde ich sowas in der MSDN???? [/Edit]

    [Edit]Erledigt 😃 [/Edit]

    [ Dieser Beitrag wurde am 11.07.2003 um 13:49 Uhr von Khadgar editiert. ]


Anmelden zum Antworten