Шаг 86.
Среда программирования Visual C++.
Сериализация данных приложения (общие сведения)

    На этом шаге мы приведем общие сведения о сериализации.

    Необходимость в хранилище постоянных данных создает дополнительные трудности при разработке объектно-ориентированных приложений. Команде разработчиков приходится решать, как сохранять структуру и взаимосвязи объектов приложения при записи и восстановлении постоянных данных. Решение этой проблемы - нетривиальное занятие, ведь обычно данные файла записываются в виде неструктурированного двоичного потока. Каркас 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

    На следующем шаге мы рассмотрим процесс сериализации.




Предыдущий шаг Содержание Следующий шаг