CString nach Serialisierung weg?
-
Hallo,
ich habe ein Programm, in dem per Serialisierung die Daten gespeichert werden. Leider kommen sie nicht so aus dem Archiv zurück, wie hinein. Die anscheinend fehlerhafte Serialisierung sieht so aus:
void CAct::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << m_Name << m_Age << m_Invited; } else { ar >> m_Name >> m_Age >> m_Invited; } m_Termin.Serialize64(ar); }Dabei sind m_Name und m_Age CStrings, m_Invited ein bool und m_Termin ein CTime.
m_Invited und m_Termin werden einwandfrei wiederhergestellt beim Auslesen des Archivs. Die beiden CStrings sind jedoch verschwunden und der Zugriff löst eine Exception an dieser Stelle aus:
Eine Ausnahme (erste Chance) bei 0x7c812a5b in Prog.exe: Microsoft C++-Ausnahme: CMemoryException an Speicherposition 0x0012ea60.. Detected memory leaks! Dumping objects -> f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\plex.cpp(29) : {363} normal block at 0x0035FE30, 124 bytes long. Data: < >x> 00 00 00 00 00 00 00 00 00 00 00 00 00 98 3E 78 f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {362} normal block at 0x0035FDD0, 36 bytes long. Data: < >x > EC 97 3E 78 13 00 00 00 13 00 00 00 01 00 00 00 ... ... ...Auch wenn ich mir die Länge der Strings ausgeben lasse, kommen unmögliche, teilweise negative Werte raus.
Die CAct-Instanzen liegen in einem CArray<CAct>, das ebenfalls serialisiert wird. Wie gesagt, nach dem wiederherstellen sind die CAct-Instanzen wieder da, mit CTime und bool, aber ohne CString.
Das ganze mit VC 2005.
Danke für eure Ideen!
schlampf
-
Dann zeige mal bitte mehr Code wo dieser Array serialisiert wird.
Dein datenstream stimmt wahrscheinlich nicht. Du schreibst was anderes als Du lesen möchtest.
-
Hier wird das CArray serialisiert:
void CEvent::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << m_EventName; } else { ar >> m_EventName; } m_ActList.Serialize(ar); }Das CArray selbst sieht so aus:
CArray<CAct> m_ActList;Die CEvent-Objekte liegen wiederum in einer CTypedPtrMap:
CTypedPtrMap <CMapWordToOb, WORD, CEvent* > m_EventMap;Diese Map wird hier serialisiert:
void CEvents::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: Hier Code zum Speichern einfügen } else { // TODO: Hier Code zum Laden einfügen RebuildUnSaved(); } m_EventMap.Serialize( ar ); }
-
Scheinbar gibt es keine handliche Lösung für das Problem, bei dem ich nicht der erste bin:
http://www.themssforum.com/MFC/Cant-read-568905/
http://support.microsoft.com/kb/193100
Da das Dokument von MS sich auf VS 6.0 bezieht, gibt es vielleicht inzwischen eine neuere, einfachere Variante? Weiß jemand was?
Gruß
-
schlampf schrieb:
Scheinbar gibt es keine handliche Lösung für das Problem, bei dem ich nicht der erste bin:
http://www.themssforum.com/MFC/Cant-read-568905/
http://support.microsoft.com/kb/193100
Da das Dokument von MS sich auf VS 6.0 bezieht, gibt es vielleicht inzwischen eine neuere, einfachere Variante? Weiß jemand was?
Gruß
Der MS Artikel hat mit Deinem Problem nichtszu tun. Denn Du hast hier keinen Unicode/MBCS wechsel.
Was heißt hier Variante. Der hüfigste Fehler ist einfach die falsche Reihenfolge der Serialisierung.
Pack mal ein element in die Liste und schau Dir den binären Stream an was gespeichert wird.
Dann schau Dir an wann Du wie lädst.
-
An der Reihenfolge der Serialisierung habe ich nichts geändert. Aber ich habe das CArray<CAct> eingetauscht gegen eine CTypedPtrList<CObList, CAct*>. Mit dieser funktioniert jetzt alles. Das Problem scheint, wie auch im 1. Link geschildert, daran zu liegen, dass sich das CArray bei der Serialisierung nicht mit CStrings verträgt...