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