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

C++ 我可以使用CArchive在MFC中序列化STL映射吗?,c++,mfc,stl,map,serialization,C++,Mfc,Stl,Map,Serialization,我需要将映射的内容(key是int的ID,value是自定义的struct)写入一个文件,然后从该文件加载它。我可以用MFC和CArchive一起做吗 谢谢大家! 我对MFC了解不多,但您的问题通过使用 struct-MapData{ int m_int; std::字符串m_str; 私人: 好友类boost::serialization::access; 模板 无效序列化(存档和ar,常量未签名整数版本) { ar&m_int; ar&m_街; } }; std::maptheData;

我需要将映射的内容(key是int的ID,value是自定义的struct)写入一个文件,然后从该文件加载它。我可以用MFC和CArchive一起做吗


谢谢大家!

我对MFC了解不多,但您的问题通过使用

struct-MapData{
int m_int;
std::字符串m_str;
私人:
好友类boost::serialization::access;
模板
无效序列化(存档和ar,常量未签名整数版本)
{ 
ar&m_int;
ar&m_街;
} 
};
std::maptheData;
模板
无效序列化(存档和ar,标准::映射&数据,常量未签名int版本)
{
ar&data;
}
后来,您想进行真正的归档:

std::ofstream ofs("filename"); 
boost::archive::binary_oarchive oa(ofs); 
oa << theData; 
std::ofs流(“文件名”);
boost::archive::二进制文件oa(ofs);

在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;
    }
  }
}
void MyClass::序列化(CArchive和archive)
{
CObject::序列化(归档);
if(archive.IsStoring()){
存档>映射大小;//读取元素计数
对于(大小i=0;i>密钥;
档案>>价值;
m_map[键]=值;
}
}
}

如果在读取归档文件时发生错误,其中一个流操作将引发异常,该异常将被更高级别的框架捕获。

谢谢!使用boost是一个不错的选择。然而,我想出了使用CArchive的方法。我的方法的主要思想是序列化映射的每个元素。
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;
    }
  }
}