Как сериализовать/десериализовать член unordered_map производного класса ⇐ C++
Как сериализовать/десериализовать член unordered_map производного класса
Поэтому я создаю симулированную файловую систему на 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()
Поэтому я создаю симулированную файловую систему на 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()
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
C++ STL: как работает набор std::unordered и хеширование std::unordered_map?
Anonymous » » в форуме C++ - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Получить указатель на член производного класса, ставший общедоступным с помощью объявления
Anonymous » » в форуме C++ - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-