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


Сериализация. Создание сериализуемого класса

Требуется сделать 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 (запись данных) или загрузить (считывание данных). Использование результатов IsStoring руководством необходимо или вставке данных выбранного объекта в объект CArchive с помощью оператора вставки (<<) или извлечь данные с помощью оператора извлечения (>>).

Рассмотрим класс, производный от 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