2008-11-04 5 views

Antwort

1

Ich weiß nicht viel über MFC, aber Ihr Problem ist eher triviale Weise gelöst Boost.Serialization

struct MapData { 
    int m_int; 
    std::string m_str; 

    private: 
    friend class boost::serialization::access; 

    template<class Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
     ar & m_int; 
     ar & m_str; 
    } 
}; 

std::map< int, MapData > theData; 

template<class Archive> 
void serialize(Archive & ar, std::map< int, MapData > & data, const unsigned int version) 
{ 
    ar & data; 
} 

verwenden und dann später waren Sie die reale Archivierung tun:

std::ofstream ofs("filename"); 
boost::archive::binary_oarchive oa(ofs); 
oa << theData; 

Das ist es .

(Disclaimer: Code einfach in dieses Feld eingegeben haben, nicht getestet wurden Tippfehler bestimmt;)

+0

Vielen Dank! Boost ist eine gute Wahl. Ich habe jedoch den Ansatz der Verwendung von CArchive ausgearbeitet. Die Grundidee meines Ansatzes besteht darin, jedes Element der Karte zu serialisieren. – user26404

7

In MFC, ich glaube, es ist am einfachsten, zunächst die Größe der Karte serialisiert und dann einfach durch alle iterieren die Elemente.

Sie nicht angeben, wenn Sie std::map oder MFC verwenden CMap, sondern eine Version basierend auf std::map könnte wie folgt aussehen:

void MyClass::Serialize(CArchive& archive) 
{ 
    CObject::Serialize(archive); 
    if (archive.IsStoring()) { 
    archive << m_map.size(); // save element count 
    std::map<int, MapData>::const_iterator iter = m_map.begin(), 
              iterEnd = m_map.end(); 
    for (; iter != iterEnd; iter++) { 
     archive << iter->first << iter->second; 
    } 
    } 
    else { 
    m_map.clear(); 
    size_t mapSize = 0; 
    archive >> mapSize; // read element count 
    for (size_t i = 0; i < mapSize; ++i) { 
     int key; 
     MapData value; 
     archive >> key; 
     archive >> value; 
     m_map[key] = value; 
    } 
    } 
} 

Wenn ein Fehler auftritt, wenn das Archiv zu lesen, einer der Streaming-Operationen sollten eine Ausnahme auslösen, die dann vom Framework auf einer höheren Ebene aufgefangen würde.