Могу ли я сериализовать карту STL в MFC с помощью CArchive? - PullRequest
6 голосов
/ 04 ноября 2008

Мне нужно записать содержимое карты (ключ - это идентификатор типа int, значение имеет самоопределяемую структуру) в файл и позже загрузить его из файла. Могу ли я сделать это в MFC с CArchive?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 04 ноября 2008

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

Если при чтении архива возникает ошибка, одна из потоковых операций должна вызвать исключение, которое затем будет перехвачено платформой на более высоком уровне.

1 голос
/ 04 ноября 2008

Я не знаю много о 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; 

Вот и все.

(отказ от ответственности: код, введенный просто в этом поле, вообще не тестировался, опечатки были предназначены;)

...