Как сериализовать/десериализовать член unordered_map производного классаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как сериализовать/десериализовать член unordered_map производного класса

Сообщение Anonymous »


Поэтому я создаю симулированную файловую систему на C++, чтобы лучше изучить язык и, возможно, немного программировать на системном уровне. Я использую Boost::Serialization для сохранения состояния файловой системы при выходе пользователя, но у меня возникают проблемы с сохранением/загрузкой моих классов. Вот мой базовый класс: введите здесь код

enum filetype { FSFILE, FSDIRECTORY, ROOT }; класс FileObject { частный: повышение класса друга:: сериализация:: доступ; шаблон void сериализовать (Архив и ar, const unsigned int) { ar & BOOST_SERIALIZATION_NVP (имя); ar & BOOST_SERIALIZATION_NVP (дата_создания); ar & BOOST_SERIALIZATION_NVP (тип); } защищено: std::имя строки; std::string date_of_creation; тип файла; Вот мой первый производный класс, который по сути будет представлять собой файл .txt в системе:

Файл класса: public FileObject { частный: повышение класса друга:: сериализация:: доступ; шаблон void сериализовать (Архив и ar, const unsigned int) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP (FileObject); ar & BOOST_SERIALIZATION_NVP (содержание); ar & BOOST_SERIALIZATION_NVP (размер); } защищено: std::строковое содержимое; внутренний размер; И, наконец, вот класс Directory, который будет действовать как каталог, содержащий файлы и/или другие каталоги:
Каталог классов: public FileObject { частный: повышение класса друга:: сериализация:: доступ; шаблон void сериализовать (Архив и ar, const unsigned int) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP (FileObject); ar & BOOST_SERIALIZATION_NVP (num_of_contents); ar & BOOST_SERIALIZATION_NVP (size_of_contents); for (auto it = this->contents.begin(); it != this->contents.end(); it++) { ar & BOOST_SERIALIZATION_NVP (это-> секунда); } } защищено: интервал num_of_contents; int size_of_contents; публика: std::unordered_map содержимого;
В моем файле main.cc есть 2 функции: одна для сохранения и одна для загрузки

void save_state(const Directory &s, const char * имя файла){ // создаем архив std::ofstream ofs (имя файла); утверждать (ofs.good()); boost::archive::xml_oarchive oa(ofs); оа > BOOST_SERIALIZATION_NVP(s); } И, наконец, вот оставшийся файл main.cc, который создает несколько файлов и каталогов и сохраняет/загружает их для целей тестирования:

int main() { символ с; scanf("%c", &c); std::string filename(boost::archive::tmpdir()); имя файла += "/demo_save.xml"; если (c == 's') { Файл file("test_file1", filetype::FSFILE); Файл file2("test_file2", filetype::FSFILE); Файл file3("test_file3", filetype::FSFILE); Файл file4("test_file4", filetype::FSFILE); Каталог dir("test_dir1", filetype::FSDIRECTORY); Каталог dir2("test_dir2", filetype::FSDIRECTORY); dir.insertContent(file.getName(), &file); dir.insertContent(file2.getName(), &file2); dir2.insertContent(file3.getName(), &file3); dir2.insertContent(file4.getName(), &file4); dir.insertContent(dir2.getName(), &dir2); save_state(каталог, имя_файла.c_str()); } Каталог обновлен; если (c == 'l') { restre_state(newd, filename.c_str()); for (auto it = newd.contents.begin(); it != newd.contents.end(); it++) { if (it->второй->getType() == filetype::FSFILE) { std::cout first второй->getType() == filetype::FSDIRECTORY) { for (auto jt = ((Каталог *)it->второй)->contents.begin(); jt != ((Каталог *)it->второй)->contents.end(); jt++) { std::cout секунда->getName()
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»