Cериализация для начинающих - Часть 3 - Сериализация производного класса
ОГЛАВЛЕНИЕ
Страница 2 из 5
Сериализация производного класса
В данном случае производный класс является производным от простого класса и не является коллекцией. Для сериализации производного класса нужно сделать следующее:
- Сериализовать сигнатуру и версию объекта
- Сериализовать базовый класс объекта << дополнительный шаг
- Сериализовать элементы (члены) объекта (если они есть)
В следующем примере класс 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);
}
