我可以使用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;
这就是它。
(免责声明:代码只需在此框中,在所有没有测试类型,错字的意欲;)
答
在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;
}
}
}
如果读取存档,流媒体业务的一个错误发生时应该抛出一个异常,然后在更高层次上被框架捕获。
谢谢! 使用boost是一个不错的选择。但是,我制定了使用CArchive的方法。我的方法的主要想法是序列化地图的每个元素。 – user26404 2008-11-04 11:18:35