Поддержка сериализации

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

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

  • Создайте класс, производный от CObject или от его производного.
  • Предоставьте для своего класса конструктор по умолчанию (без параметров).
  • Вставьте 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);
    };
    
  • Добавьте макрос IMPLEMENT_SERIAL в файл с реализацией Вашего класса.
    В IMPLEMENT_SERIAL передаются три параметра: имя класса, в который требуется
    встроить поддержку сериализации, имя его родительского класса и номер структуры
    (schema number). Вот пример обращения к этому макросу:

        IMPLEMENT_SERIAL(CMyClass, CObject, 1)
    

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

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

  • Создайте в своем классе перегруженную функцию CObject::Serialize().
  •    
    На следующем шаге мы рассмотрим сериализацию классов-наборов.



    Вы можете оставить комментарий, или Трекбэк с вашего сайта.

    Оставить комментарий