[Serialisierung]
-
Hi,
nachdem ich die LinkedList aufgeben musste (siehe vorige Threads) möchte ich
nun ein Array binär(?) in eine Datei schreiben. Ich habe ein Array mit mehreren
komplexen Objekten vorliegen und möchte das sowohl in diese Datei schreiben,
als auch als Array auslesen können.Der Plan sah so aus:
CFile f(DATEINAME, CFile::modeReadWrite); CArchive a(%f); a<<kontake;Wobei kontakte das Array ist.
Diese Idee stammt aus Horchsteins Thread "Serialisierung - weitere Frage" und
zwingt meinen Compiler leider dazu sich über die Übergabe der Referenz eines
File-Objekts an den Konstruktor des CArchivs zu beschweren.Hat einer von Euch ne Idee weshalb?
Ist das überhaupt so realisierbar?Danke im Voraus,
Khadgar
-
Denk' dran, dass du dem Archiv auch sagen musst, wie es zu funktionieren hat! (nebenbei sind die genauen Fehlermeldungen des Compilers in solchen Fällen meist hilfreich...
)CFile file("bla.txt", CFile::modeCreate | CFile::modeWrite); CArchive ar(&file, CArchive::store); ar << 123;
-
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, dannCArchive& 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. ]