На этом шаге мы рассмотрим поддержку сериализации в произвольном классе.
Мы уже показывали, как в объекте документа могут находиться другие объекты, реализующие
собственные процедуры сериализации. Сериализуемый класс создается в следующей последовательности.
заголовочном файле. DECLARE_SERIAL, а также его парный макрос
IMPLEMENT_SERIAL предоставляют Вашему классу информацию о
MFC-классе времени выполнения. Кроме того, они предоставляют глобальный
оператор "извлечь из потока" (>>), который использует информацию класса
времени выполнения для восстановления объектов создаваемого Вами класса. Последний
передается в DECLARE_SERIAL в качестве параметра.
Вот пример объявления сериализуемого класса:
// MyClass.h class CMyClass : public CObject { DECLARE_SERIAL(CMyClass) public: CMyClass() {;} // Конструктор по умолчанию virtual void Serialize(CArchive& ar); };
В IMPLEMENT_SERIAL передаются три параметра: имя класса, в который требуется
встроить поддержку сериализации, имя его родительского класса и номер структуры
(schema number). Вот пример обращения к этому макросу:
IMPLEMENT_SERIAL(CMyClass, CObject, 1)
Номер структуры позволяет отслеживать изменения версий файлов с документами. Вполне вероятно,
что структура документов Вашего приложения будет изменяться по мере выпуска новых версий программы.
Это иногда создает проблемы для пользователя, который попытается открыть в новой версии документ,
созданный более старым вариантом программы.
Чтобы исключить это, Вы можете при изменении структуры объекта откорректировать номер
структуры в макросе IMPLEMENT_SERIAL. Это позволит добавить в программу код, способный
обнаруживать несоответствия между версиями приложения и документа и предпринять ответные действия,
например выдать сообщение об ошибке или запустить подпрограмму преобразования формата открываемого
документа.
На следующем шаге мы рассмотрим сериализацию классов-наборов.