Мне нужно записать содержимое карты (ключ ID из int, значение имеет самоопределяемую структуру) в файл и загрузить его из файла позже. Могу ли я сделать это в MFC с CArchive?Могу ли я сериализовать карту STL в MFC с помощью CArchive?
Спасибо!
Мне нужно записать содержимое карты (ключ ID из int, значение имеет самоопределяемую структуру) в файл и загрузить его из файла позже. Могу ли я сделать это в MFC с CArchive?Могу ли я сериализовать карту STL в MFC с помощью CArchive?
Спасибо!
Я не знаю много о 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
или МФЦ 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