Шаг 89.
Среда программирования Visual C++.
Поддержка сериализации

    На этом шаге мы рассмотрим поддержку сериализации в произвольном классе.

    Мы уже показывали, как в объекте документа могут находиться другие объекты, реализующие собственные процедуры сериализации. Сериализуемый класс создается в следующей последовательности.

  1. Создайте класс, производный от CObject или от его производного.

  2. Предоставьте для своего класса конструктор по умолчанию (без параметров).

  3. Вставьте MFC-макрос DECLARE_SERIAL в объявление класса в заголовочном файле. DECLARE_SERIAL, а также его парный макрос IMPLEMENT_SERIAL предоставляют Вашему классу информацию о MFC-классе времени выполнения. Кроме того, они предоставляют глобальный оператор "извлечь из потока" (>>), который использует информацию класса времени выполнения для восстановления объектов создаваемого Вами класса. Последний передается в DECLARE_SERIAL в качестве параметра.

        Вот пример объявления сериализуемого класса:

    // MyClass.h
    class CMyClass : public CObject
    {
      DECLARE_SERIAL(CMyClass)
      public:
        CMyClass() {;} // Конструктор по умолчанию
        virtual void Serialize(CArchive& ar);
    };
    

  4. Добавьте макрос IMPLEMENT_SERIAL в файл с реализацией Вашего класса. В IMPLEMENT_SERIAL передаются три параметра: имя класса, в который требуется встроить поддержку сериализации, имя его родительского класса и номер структуры (schema number). Вот пример обращения к этому макросу:
        IMPLEMENT_SERIAL(CMyClass, CObject, 1)
    

        Номер структуры позволяет отслеживать изменения версий файлов с документами. Вполне вероятно, что структура документов Вашего приложения будет изменяться по мере выпуска новых версий программы. Это иногда создает проблемы для пользователя, который попытается открыть в новой версии документ, созданный более старым вариантом программы.

        Чтобы исключить это, Вы можете при изменении структуры объекта откорректировать номер структуры в макросе IMPLEMENT_SERIAL. Это позволит добавить в программу код, способный обнаруживать несоответствия между версиями приложения и документа и предпринять ответные действия, например выдать сообщение об ошибке или запустить подпрограмму преобразования формата открываемого документа.

  5. Создайте в своем классе перегруженную функцию CObject::Serialize().

    На следующем шаге мы рассмотрим сериализацию классов-наборов.




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