Cериализация для начинающих - Часть 1 - Шаг 3 - Сериализация объекта

ОГЛАВЛЕНИЕ

Шаг 3 – Сериализация объекта

Сериализация объекта выполняется с помощью вызова его метода serialize(). serialize() – это всего лишь созданный программистом метод. Он не имеет никакого отношения к объекту MFC CObject::Serialize(). Также вам не нужно  порождать ваш объект с помощью CObject. Метод serialize() принимает указатель на CArchive и возвращает информацию о состоянии в виде целого числа.

  int CFoo::serialize

    (CArchive* pArchive)

  {
    int nStatus = SUCCESS;

    // Сериализация данного объекта ...
    ...
       return (nStatus);
  }

Фактическая процедура сериализации выполняется быстро. При этом не мешает разобраться с парой важных моментов:

  • Такой же метод CFoo::serialize() используется для чтения/записи объекта из/в постоянное хранилище.
  • CFoo::serialize() не знает ничего о файле, к которому получает доступ.

Предположим, что CFoo представляет собой запись о сотруднике, содержащую пару элементов данных.

   class CFoo

  {
    // Конструктор/деструктор
    public:
      CFoo::CFoo();
      virtual CFoo::~CFoo();
 
    // Методы
    public:
      int serialize (CArchive* pArchive);
 
    // Элементы данных
    public:
      CString  m_strName;  // имя сотрудника
      int      m_nId;      // идентификатор сотрудника

  };

Потоковые операторы CArchive << и >> используются для чтения/записи элементов данных из/в архив. CArchive знает, как сериализовать простые типы данных, такие как int, float, DWORD, и объектные, такие как CString. Архив также знает, в режиме чтения или записи он находится. Вы можете запросить его режим с помощью вызова CArchive::IsStoring(). Метод сериализации CFoo можно написать таким образом:

   int CFoo::serialize

    (CArchive* pArchive)

  {
    int nStatus = SUCCESS;
    // Сериализация объекта ...
    ASSERT (pArchive != NULL);
    try

    {
      if (pArchive->IsStoring()) {
         // Запись имени и идентификатора сотрудника
         (*pArchive) << m_strName;
         (*pArchive) << m_nId;

      }

      else {
         // Чтение имени и идентификатора сотрудника
         (*pArchive) >> m_strName;
         (*pArchive) >> m_nId;
      }

    }

    catch (CException* pException)
    {
      nStatus = ERROR;
    }

    return (nStatus);

  }

Шаг 4 – Освобождение памяти

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

  pArchive->Close();
  delete pArchive;
  pFile->Close();
  delete pFile();

Заключение

Здесь сериализация была описана кратко, в двух словах. В Части 2 описывается, как обрабатывать чтение данных из неисправных хранилищ данных и поддерживать различные версии нашего объекта. В Части 3 рассматривается сериализация сложных объектов.

Автор: Ravi Bhavnani