我可以使用CArchive序列化MFC中的STL映射吗?

问题描述:

我需要将一个映射的内容(键是int的ID,值是自定义结构)写入一个文件,然后从文件中加载它。我可以在MFC中使用CArchive吗?我可以使用CArchive序列化MFC中的STL映射吗?

谢谢!

我不知道很多关于MFC,但你的问题是相当平凡使用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; 
} 

再后来是你想要做真正的归档解决:

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

这就是它。

(免责声明:代码只需在此框中,在所有没有测试类型,错字的意欲;)

+0

谢谢! 使用boost是一个不错的选择。但是,我制定了使用CArchive的方法。我的方法的主要想法是序列化地图的每个元素。 – user26404 2008-11-04 11:18:35

在MFC中,我相信这是最简单的先序列化地图的大小,然后简单地通过所有迭代要素。

如果使用std::map或MFC的CMap,但基于std::map版本可能看起来像这样没有指定:

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; 
    } 
    } 
} 

如果读取存档,流媒体业务的一个错误发生时应该抛出一个异常,然后在更高层次上被框架捕获。