Поделиться через


Класс Serialization: Making a Serializable

Необходимо, чтобы делают 5 основных этапов класс является сериализуемым.Они ниже перечислены и описаны в следующих разделах:

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

  2. Переопределить функцию-член сериализации.

  3. Использование макроса DECLARE_SERIAL в объявлении класса.

  4. Определение конструктор, который не принимает аргументов.

  5. Использование макроса IMPLEMENT_SERIAL в файле реализации для класса.

При вызове Serialize напрямую, а не с помощью операторов >> и << CArchive, то последние 3 шагов необходимы для сериализации.

Класс, производный от CObject

Основные протокол и возможности сериализации определяются в классе CObject.Путем наследования от класса CObject (или класса, производного от CObject), как показано в следующем объявлении класса CPerson, можно получить доступ к протоколу сериализации и возможностей CObject.

Переопределить функцию-член сериализации

Функция-член Serialize, который определен в классе CObject, отвечающий за фактически сериализации данные, необходимые захвативший текущее состояние объекта.Функция Serialize имеет аргумент CArchive, который используется для чтения и записывает данные объекта.Объект CArchive содержит функцию-член, IsStoring, указывающее, хранятся ли данные Serialize (записи) или load (данные чтения).Использование результатов IsStoring как руководство или вставьте данные объекта в объект CArchive с помощью оператора insert (<<) или извлечь данные с оператором извлечения (>>).

Рассмотрим класс, производный от CObject и имеет 2 новых типов CString переменной члена, а word.В следующем фрагменте объявления классов отображает новые переменные-члены и объявление переопределенного функции-члена Serialize:

class CPerson : public CObject
{
public:
    DECLARE_SERIAL( CPerson )
    // empty constructor is necessary
    CPerson();
   virtual ~CPerson();

    CString m_name;
    WORD   m_number;

    void Serialize( CArchive& archive );
};

Переопределить функцию-член сериализации

  1. Вызовите ваша версия базового класса Serialize, чтобы убедиться, что сериализуется унаследованная часть объекта.

  2. Вставьте или извлеките переменные-члены, относящиеся к классу.

    Операторы вставки и обновления взаимодействуют с классом архива для чтения и записи данных.В следующем примере показано, как реализовать Serialize для класса CPerson объявленного выше:

    void CPerson::Serialize( CArchive& archive )
    {
        // call base class function first
        // base class is CObject in this case
        CObject::Serialize( archive );
    
        // now do the stuff for our specific class
        if( archive.IsStoring() )
            archive << m_name << m_number;
        else
            archive >> m_name >> m_number;
    }
    

Можно также использовать функции-члены CArchive::Read и CArchive::Write для считывания и записи больших объемов нетипизированных данных.

Использование макроса DECLARE_SERIAL

Макрос DECLARE_SERIAL является обязательным в декларации классов, которые поддерживают сериализацию, как показано ниже:

class CPerson : public CObject
{
public:
    DECLARE_SERIAL( CPerson )

Указание конструктор без аргументов

MFC требуется конструктор по умолчанию, когда он повторно создает объекты по мере их десериализации (загружен с диска).Процесс десериализации заполняет во всех переменных-членов со значениями, воссоздал объект.

Этот конструктор может быть объявлен как открытым, защищенными или закрыто.Если выполнить его защищенным или закрытые, помогаете убедиться, что он будет использоваться только функциями сериализации.Конструктор должен помещать объект в состояние, позволяющее его для удаления, если это необходимо.

ПримечаниеПримечание

Если забываете определить конструктор без аргументов в классе, использующий макросы DECLARE_SERIAL и IMPLEMENT_SERIAL доступ «нет конструктора по умолчанию доступное» предупреждение компилятора IMPLEMENT_SERIAL на линии, где используется макрос.

Использование макроса IMPLEMENT_SERIAL в файле реализации

Макрос IMPLEMENT_SERIAL используется для определения различных функций требуется при наследовании сериализуемый класс от CObject.Используйте этот макрос в файле реализации (.CPP) для класса.Первые 2 аргумента к макросу имя класса и имя его немедленного базового класса.

Третий аргумент для этого макроса номер схемы.Номер схемы значительно номер версии для объектов класса.Используйте целое число, большее или равное 0 для номера схемы.(Не путайте этот номер схемы с терминологией базы данных).

Проверки кода сериализации MFC число объектов схемы при чтении в память.Если номер схемы объекта на диске не соответствует числу схемы классов в памяти, то библиотека вызывает исключение CArchiveException, предотвращая программы из считывания неверная версия объекта.

Для функции-члена Serialize иметь возможность чтения нескольких версий, - то есть файлы, записанные с различными версиями приложений — значение VERSIONABLE_SCHEMA можно использовать в качестве аргумента макроса IMPLEMENT_SERIAL.Для данных потребления и пример см. в разделе GetObjectSchema функции-члена класса CArchive.

В следующем примере показано, как использовать IMPLEMENT_SERIAL для класса, CPerson, который является производным от CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

После создания сериализуемый класс можно сериализовать объекты класса, как описано в статье сериализация: сериализовать объект.

См. также

Основные понятия

Сериализация в MFC