На этом шаге мы приведем общие сведения о сериализации.
Необходимость в хранилище постоянных данных создает дополнительные трудности при разработке объектно-ориентированных приложений. Команде разработчиков приходится решать, как сохранять структуру и взаимосвязи объектов приложения при записи и восстановлении постоянных данных. Решение этой проблемы - нетривиальное занятие, ведь обычно данные файла записываются в виде неструктурированного двоичного потока. Каркас MFC-приложения помогает разрешить эту непростую ситуацию, предлагая сериализацию (serialization) - метод сохранения структуры данных прикладных объектов при записи и восстановлении из архива постоянного хранения.
Встроенная в MFC сериализация обеспечивается классом CObject. Необходимо, чтобы все другие поддерживающие сериализацию классы были производными от CObject и перегружали функцию CObject::Serialize(). Задача Serialize() заключается в архивировании отдельных данных класса и сохранении и восстановлении их из объекта MFC-класса CArchive.
CArchive служит посредником между сериализуемым объектом и средой хранения данных и всегда связывается с объектом CFile. Обычно последний представляет дисковый файл, но ничто не запрещает ему представлять и файл в памяти. Например, можно связать CArchive с объектом CSharedFile для сериализации данных в буфере (или из буфера) обмена Windows. Кроме того, объект CArchive поддерживает механизм буферизации, сохраняющий типы при чтении и записи сериализуемых объектов в и из объекта CFile.
Отдельно взятый объект CArchive можно применять либо для хранения данных, либо для их загрузки, но никогда - для обеих операций одновременно. Время жизни CArchive ограничено одним проходом записи в файл или чтения объектов из файла. Для сериализации в файл и восстановления из файла создаются отдельные объекты CArchive. Предназначение CArchive (запись или чтение) можно определить, обратившись к функции CArchive::IsStoring(), возвращающей булево значение.
В классе CArchive определены операторы помещения в поток (<<) и извлечения из потока (>>). Они применяются так же, как и в стандартных классах потоков C++. Это проиллюстрировано в следующем коде:
if (ar. IsStoring()) { ar << m_string; } else { ar >> m_string; }
Вы можете использовать их для сохранения или извлечения данных из объектов CArchive. Ниже приведены типы данных и объекты, совместимые с операторами помещения в поток и извлечения из потока.
CObject* SIZE и CSize Float WORD CString POINT и CPoint DWORD BYTE RECT и CRect double LONG CTime и CTimeSpan int COleCurrency COleVariant COleDateTime COleDateTimeSpan
На следующем шаге мы рассмотрим процесс сериализации.