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

ОГЛАВЛЕНИЕ

Сериализация производного класса

В данном случае производный класс является производным от простого класса и не является коллекцией. Для сериализации производного класса нужно сделать следующее:

  1. Сериализовать сигнатуру и версию объекта
  2. Сериализовать базовый класс объекта << дополнительный шаг
  3. Сериализовать элементы (члены) объекта (если они есть)

В следующем примере класс ColoredPoint является производным от класса Point и содержит дополнительный целочисленный член (int), названный m_nColor, который определяет цвет точки. Как и все упорядочиваемые классы, ColoredPoint также определяет статическую сигнатуру и версию.

  int ColoredPoint::serialize

    (CArchive* pArchive)
  {
    ASSERT (pArchive != NULL);
    // Шаг 1: Сериализация сигнатуры и версии
    int nVersion;
    try {
      if (pArchive->IsStoring()) {
          (*pArchive) << ColoredPoint::m_strSignature;
          (*pArchive) << ColoredPoint::m_nVersion;
      } else {
          CString strSignature;
          (*pArchive) >> strSignature;
          if (strSignature != ColoredPoint::m_strSignature)
             return (Status::InvalidFormat);
          (*pArchive) >> nVersion;
          if (nVersion > ColoredPoint::m_nVersion;)
             return (Status::UnsupportedVersion);
      }

      // Шаг 2: Сериализация базового класса
      int nStatus = Point::serialize (pArchive);
      if (nStatus != Status::Success)
         return (nStatus);

      // Шаг 3: Сериализация членов
      if (pArchive->IsStoring())
         (*pArchive) << m_nColor;
      else
         (*pArchive) >> m_nColor;

    }

    catch (CException* pException) {
      // Произошла ошибка чтения/записи
      pException->Delete();
      if (pArchive->IsStoring())
        return (Status::WriteError);
      return (Status::ReadError);

    }

    // Объект был успешно сериализован (упорядочен)
    return (Status::Success);

  }