2010-12-12 4 views
5

возможно ли сериализовать любой класс STL, включая std :: string? У меня есть набор std :: строк, и я пытаюсь записать их в файл и загрузить их обратно в std :: set.Сериализация класса STL

ответ

10

Да, это возможно. Например, с boost.serialization.

Для СТЛ, прочитать corresponding tutorial section

+0

Я мог делать со строками, можно ли это сделать непосредственно с помощью набора, например? – user963241

+2

@cpx: '#include ' – Abyx

+0

Он не хочет иметь пример, который создает класс с контейнером STL, он хочет пример функции, которая получает контейнер STL и замаскивает его файл. –

4

Если вы просто хотите, чтобы написать std::set<std::string> в файл и читать его обратно, и ваш проект уже не использовать Boost, вы можете попробовать что-то простое:

ofstream file("file.txt"); 
copy(theSet.begin, theSet.end(), ostream_iterator<string>(file, "\n")); 

Это просто напишет строки, по одному в каждой строке, в текстовый файл. Тогда читать их:

ifstream file("file.txt"); 
string line; 
while(getline(file, line)) 
    theSet.insert(line); 
+2

Что делать, если эти строки содержат новую строку? Это очень плохая идея ... –

+1

Конечно, если строки содержат символы новой строки, это не сработает. Я бы согласился поспорить, что OP этого не делают. –

+0

Почему вы не разделите их с нулевым символом? Строки C обычно не содержат этих строк. –

4

приведен пример использования подталкивание :: сериализации сериализовать типа STL

#include <map> 
#include <fstream> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 

#include <boost/serialization/map.hpp> 

int main(int argc,char** argv) { 
    std::ofstream s("tmp.oarchive"); 
    boost::archive::text_oarchive oa(s); 
    std::map<int,int> m; 
    m[1] = 100; 
    m[2] = 200; 
    oa << m; 
} 

Compile с

g++ -lboost_serialization myfile.cc 

Обратите внимание, что

  1. #include <boost/archive/text_iarchive.hpp> должен быть до любого другого boost Сериализация включает.
  2. Вам необходимо включить заголовок для STL-типа, который вы хотите архивировать.
1

проверьте это. Облегченный достаточно

STL serialization

ТОЛЬКО ОДИН CPP Файла

облегченных сериализации решение

есть несколько импровизировать из там сериализации поддержки, как protobuffer, подталкивания: сериализации, слишком тяжелы для меня. поэтому я написал эту облегченную версию.

поддержка
  • вектор
  • карта
  • набор
  • строка
  • примитивы (целое, двойной, длинный, ...)
  • обратный порядок байт поддержки
  • вложенности поддержка контейнера

использовать символ вместо BOOL в STL why

сборки

вы можете создать этот проект CMake. или просто импортируйте serialization.h в свой проект.

определить CHECK_ENDIAN = 1, если вы хотите проверить обратный порядок байт

демо

проверка testSerialization.cpp

пришедшего Soom

обратный порядок байт преобразования.

Смежные вопросы