Gelöst: Klasse von CMap abgeleitet --> Serialisieren
-
Hi,
ich habe eine eigene Klasse von CMap abgeleitet:
class CErrorMap : public CMap<CString, LPCTSTR, CErrorEntry*, CErrorEntry*>
CErrorEntry schaut wiederum so aus (die nur einen CString und ein COleDateTime als Member hat):
IMPLEMENT_SERIAL(CErrorEntry, CObject, 1); CErrorEntry::CErrorEntry() { } CErrorEntry::~CErrorEntry() { } void CErrorEntry::Serialize(CArchive &ar) { CObject::Serialize(ar); if (ar.IsStoring()) ar << m_strDescription << m_dtTimeStamp; else ar >> m_strDescription >> m_dtTimeStamp; }
Ich will nun meine Map serialisieren (Laden, Speichern), nur weiß ich nicht, wie das genau aussehen muss.
Habe bis jetzt so einiges gelesen, dass man z.B. eine eigene SerializeElements definieren soll, nur wird diese nicht aufgerufen, wenn ich diese in meiner CErrorEntry-Klasse definiere.Wie muss ich da jetzt vorgehen ? Wie muss meine Serialize-Funktion in meiner Map-Klasse aussehen ??
Ich sag schonmal vielen Dank.
-
Hat da jemand einen Plan ??
-
Ich muss noch einmal fragen: Kann mir echt keiner helfen ??
-
Hallo,
Wie muss meine Serialize-Funktion in meiner Map-Klasse aussehen
Benötigst du hier nicht unbedingt, weil die schon vorhandene Standard-Implementierung SerializeElements aufruft. Wichtig ist deshalb nur die richtige Definition der Helfer-Funktion SerializeElements.
nur wird diese nicht aufgerufen, wenn ich diese in meiner CErrorEntry-Klasse definiere.
Vielleicht liegt hier schon das Problem. SerializeElements ist eine globale Helferfunktion, und deshalb ausserhalb von jeder Klasse zu definieren, damit sie aufgerufen werden kann.
In dieser globalen Funktion kannst du dann z.B. die Serialize-Funktion der CErrorEntry-Klasse aufrufen. Du musst noch bedenken, dass auch die Keys der Map über SerializeElements gespeichert werden, wenn du, wie ich oben angedeutet habe, keine eigene Serialize-Funktion für deine Map-Klasse bereit stellst, denn die Standard-Serialize-Funktion ruft zwei Mal SerializeElements auf:
SerializeElements<KEY>(ar, &pAssoc->key, 1); SerializeElements<VALUE>(ar, &pAssoc->value, 1);
MfG,
Probe-Nutzer
-
Hi,
ok, also zur Definition der Helper-Function. In meinem Header (Def. der ErrorEntry-Klasse, der ErrorMap-Klasse und der Klasse, in der später Serialize aufgerufen wird) sieht es so aus:
// Represents an error object... class CErrorEntry : public CObject { public: DECLARE_SERIAL(CErrorEntry); CErrorEntry(); virtual ~CErrorEntry(); virtual void Serialize(CArchive &ar); public: // The description of the error CString m_strDescription; // The timestamp COleDateTime m_dtTimeStamp; }; // Helper function... void AFXAPI SerializeElements(CArchive &ar, CErrorEntry *pEntry, int nCount); // Map with CString Keys... class CErrorMap : public CMap<CString, LPCTSTR, CErrorEntry*, CErrorEntry*> { DECLARE_DYNAMIC(CErrorMap) public: CErrorMap(INT_PTR nBlockSize = 10); virtual ~CErrorMap(); private: bool CreateKey(CString &strKey); void ParseEntry(CString &strEntry); public: bool InsertEntry(CString &strEntry); void FreeOldEntries(); INT_PTR CountSameItems(const CString &strEntry); void RemoveAll(); private: CCriticalSection m_crit; }; ...
Und im cpp-File...
IMPLEMENT_SERIAL(CErrorEntry, CObject, 1); CErrorEntry::CErrorEntry() { } CErrorEntry::~CErrorEntry() { } void CErrorEntry::Serialize(CArchive &ar) { CObject::Serialize(ar); if (ar.IsStoring()) ar << m_strDescription << m_dtTimeStamp; else ar >> m_strDescription >> m_dtTimeStamp; } //////////////////////////////////////////////////////////////////////////////////// ... void AFXAPI SerializeElements(CArchive &ar, CErrorEntry *pEntry, int nCount) { for (int i = 0; i < nCount; i++, pEntry++) pEntry->Serialize(ar); } ... // irgendwann der Call der Serialize-Funktion der CErrorMap...
... wird direkt nach der Definition der Klasse CErrorEntry die Helperfunktion definiert. Trotzdem wird der Breakpoint in der Funktion nicht angesprungen, wenn Serialize des CErrorMap-Objekts in der anderen Klasse aufgerufen wird.
Das verstehe ich jetzt nicht ganz, so sollte es doch aussehen !?
Oder übersehe ich noch was ?
-
Ok, SerializeElements war so auch nicht ganz korrekt:
template<> void AFXAPI SerializeElements<CErrorEntry>(CArchive& ar, CErrorEntry* pElements, INT_PTR nCount) { for (int i = 0; i < nCount; i++, pElements++) pElements->Serialize(ar); }
Habe es auch probiert, die in stdafx zu definieren, aber die Funktion wird einfach nicht aufgerufen...
Was stimmt da nicht ??
-
Ok, habe es doch geschafft.
Habe die Serialize-Funktion meiner Map-Klasse überschrieben, darin dann den Count geschrieben oder gelesen und rufe (solange der Count > 0 ist) Serialize für CStringA und für meine ErrorEntry-Klasse auf.So funktioniert es !
Aber trotzdem vielen Dank für deine Hilfe !!