C ++ Сериализация std :: map в файл - PullRequest
13 голосов
/ 14 ноября 2011

У меня есть карта C ++ STL, которая представляет собой карту типа int и customType.CustomType - это структура, которая содержит строку и список строк. Как я могу сериализовать это в файл.

пример структуры:

struct customType{
string;
string;
int;
list<string>;
}

Ответы [ 5 ]

10 голосов
/ 14 ноября 2011

Если вы не боитесь BOOST, попробуйте BOOST Serialize: (код шаблона, здесь могут быть некоторые ошибки ...)

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/list.hpp> 

struct customType{
 string string1;
 string string2;
 int i;
 list<string> list;

// boost serialize 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> void serialize(Archive &ar, const unsigned int version) { 
        ar & string1; 
        ar & string2; 
        ar & i;
        ar & list;
    } 
};

template <typename ClassTo> 
int Save(const string fname, const ClassTo &c) 
{ 
    ofstream f(fname.c_str(), ios::binary);
    if (f.fail()) return -1;
    boost::archive::binary_oarchive oa(f); 
    oa << c; 
    return 0;
} 

Использование:

Save< map<int, customType> >("test.map", yourMap); 
7 голосов
/ 14 ноября 2011

Простое решение - вывести каждый элемент в отдельной строке, включая все строки в списке. Каждая запись начинается с ключа к карте и заканчивается специальным символом или последовательностью символов, которой нет в списке. Таким образом, вы можете читать по одной строке за раз и знать, что первая строка - это ключ карты, вторая строка - первая строка в структуре и т. Д., И когда вы достигнете своей специальной последовательности окончания записи, вы знаете, что список готов и пришло время для следующего элемента на карте. Эта схема делает сгенерированные файлы читабельными и редактируемыми, если вам нужно редактировать их вне программы.

1 голос
/ 14 ноября 2011

C ++ не имеет таких возможностей отражения, как Java и другие, поэтому нет «автоматического» способа сделать это. Вы должны будете сделать всю работу самостоятельно: открыть файл, вывести каждый элемент в цикле и закрыть файл. Также нет стандартного формата файла, вам нужно определить тот, который соответствует вашим потребностям. Конечно, есть библиотеки, которые могут помочь в этом, но они не являются частью языка. Посмотрите на этот вопрос:

Можно ли автоматически сериализовать объект C ++?

Также взгляните на: http://s11n.net/

0 голосов
/ 14 ноября 2011

Вы можете попробовать это: cxx-prettyprint

0 голосов
/ 14 ноября 2011

Если вы спрашиваете об этом, то, вероятно, вы уже знаете, что не можете сериализовать это с помощью:

file.write( (const char *) &mapOfCustom, sizeof( mapOfCustom ) );

Проблема связана со сложными объектами (а в C ++ даже строковая переменнаясложный объект), т. е. те объекты, которые не являются автономными.На самом деле, даже у простой сериализации есть проблемы, которые варьируются от совместимости с платформой до даже совместимости с компилятором (различные дополнения и т.*http://www.grinninglizard.com/tinyxml/

И записать сохранить в XML и восстановить из процедур XML.

...