【问题标题】:Can I serialize map of STL in MFC using CArchive?我可以使用 CArchive 在 MFC 中序列化 STL 的映射吗?
【发布时间】:2010-09-20 15:30:04
【问题描述】:

我需要将map的内容(key是int的ID,value是自定义struct)写入文件,稍后从文件中加载。我可以在 MFC 中使用 CArchive 执行此操作吗?

谢谢!

【问题讨论】:

    标签: c++ mfc stl map serialization


    【解决方案1】:

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

    如果在读取存档时发生错误,则其中一个流操作应引发异常,然后由更高级别的框架捕获。

    【讨论】:

      【解决方案2】:

      我对 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; 
      

      就是这样。

      (免责声明:代码只是在此框中键入,根本没有测试,错字是故意的;)

      【讨论】:

      • 谢谢!使用 boost 是一个不错的选择。但是,我制定了使用 CArchive 的方法。我的方法的主要思想是序列化地图的每个元素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      相关资源
      最近更新 更多