Сериализация трудно реализуется для любых классов, не считая тривиальных. Если в вашем классе имеются ссылки или указатели на другие классы, что характерно для большинства нетривиальных классов, вам придется учесть потенциальную возможность наличия циклических ссылок, обработать их должным образом при записи в поток объектов и правильно реконструировать ссылки при считывании объектов. Если вам приходится строить что-то «с чистого листа», необходимо учесть эти особенности проектирования, однако если вы можете использовать внешнюю библиотеку, вам следует воспользоваться библиотекой Boost Serialization, которая обеспечивает переносимый фреймворк сериализации объектов.
Смотри
также
Рецепт 10.5.
10.5. Создание класса, считываемого из потока
Проблема
В поток записан объект некоторого класса и теперь требуется считать эти данные из потока и использовать их для инициализации объекта того же самого класса.
Решение
Используйте
operator>>
для чтения данных из потока в ваш класс для заполнения значений данных-членов; это просто является обратной задачей по отношению к тому, что сделано в примере 10.6. Реализация приводится в примере 10.7.
Пример 10.7. Чтение данных из потока в объект
#include <iostream>
#include <istream>
#include <fstream>
#include <string>
using namespace std;
class Employee {
friend ostream& operator<< // Они должны быть друзьями,
(ostream& out, const Employee& emp); // чтобы получить доступ к
При создании класса, считываемого из потока, выполняемые этапы почта совпадают с этапами записи объекта в поток (только они имеют обратный характер) Если вы еще не прочитали рецепт 10.4, это необходимо сделать сейчас, чтобы был понятен пример 10.7.
Во-первых, вам необходимо объявить
operator>>
как дружественный для вашего целевого класса, однако в данном случае вам нужно, чтобы он использовал поток
istream
, а не
ostream
. Затем определите оператор
operator>>
(вместо
operator<<
) для прямого чтения значений из потока в каждую переменную-член вашего класса. Завершив чтение данных, возвратите входной поток.
Смотри также
Рецепт 10.4.
10.6. Получение информации о файле
Проблема
Требуется получить информацию о файле, например о его размере, номере устройства, времени последнего изменения и т.п.
Решение
Используйте вызов системной C-функции
stat
, определенной в
<sys/stat.h>
. См. Пример 10.8, где показано типичное применение stat для вывода на печать некоторых атрибутов файла.