【发布时间】:2010-09-20 15:30:04
【问题描述】:
我需要将map的内容(key是int的ID,value是自定义struct)写入文件,稍后从文件中加载。我可以在 MFC 中使用 CArchive 执行此操作吗?
谢谢!
【问题讨论】:
标签: c++ mfc stl map serialization
我需要将map的内容(key是int的ID,value是自定义struct)写入文件,稍后从文件中加载。我可以在 MFC 中使用 CArchive 执行此操作吗?
谢谢!
【问题讨论】:
标签: c++ mfc stl map serialization
在 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;
}
}
}
如果在读取存档时发生错误,则其中一个流操作应引发异常,然后由更高级别的框架捕获。
【讨论】:
我对 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;
就是这样。
(免责声明:代码只是在此框中键入,根本没有测试,错字是故意的;)
【讨论】: