Създаване на собствени класове, поддържащи сериализация
| Информационни технологии | 2009-12-04 | 123 сваляния |
25 Създаване на собствени класове, поддържащи сериализация. Кога се налага пряко използване на Serialize().
Създаване на клас, поддържащ сериализация.
-
Новосъздаденият клас наследява CObject;
-
В декларацията на класа DECLARE_SERIAL( име на класа)
-
Предефинирвате Serialize() на базовия клас и сериализирате данновите членове на производния клас (ще поясним по-късно).
-
Подразбиращ се конструктор на класа.
-
В частта имплементация на класа IMPLEMENT_SERIAL
Конструктор по подразбиране това е конструктор без параметри. Когато класът поддържа сериализация този конструктор задължително трябва да го има. Донамичното създаване на обектиизползва винаги подразбиращият конструктор.
>> оператор за десериализиране, <<оператор за сериализиране.
Кога се използва Serialize().
-
При десериализиране на конструиран обект, не знаем името и сме заделили памет.
-
Ако обектът е сериализиран със Serialize() трябва да се десериализира със Serialize().
-
Ако създаваният клас има даннов елемент проявление или наследник на класа CОbject също се използва Serialize(), защото операциите << >> са дефинирани в CОbject да работят с указатели на обекти, а не с обекти.
-
Ако сериализираният клас има даннов елемент указател към Cоbject или негов наследник, тогава имаме 2 възможности 1. Първо трябва да се конструира данновият обект във функцията за сериализация и след това да се използва указателя. Използването става по 2 начина:
PObject // указател
-
PОbject ->Serialize();
-
ar>>m.mydata>>p.Object
IMPLEMENT_SERIAL този макрос иска три параметъра.
пример:
class CLine : public CObject
{ DECLARE_SERIAL (CLine)
protected: CPoint m_ptFrom;
CPoint m_ptTo;
public: CLine() {}
CLine( CPoint from, CPoint to) {m_ptFrom = from; m_ptTo = to;}
void Serialize (Carchive& ar ); };
като дефинирате ф-ията Serialize така:
void CLine::Serialize( CArchive& ar)
{ CObject::Serialize( ar);
if ( ar.IsStoring()) ar << m_ptFrom << m_ptTo;
else ar >> m_ptFrom >> m_ptTo;
}
добавяте и някъде в имплементацията:
IMPLEMENT_SERIAL( CLine, CObject, 1)
IMPLEMENT_SERIAL( CLine, CObject, 1 | VERSIONABLE_SCHEMA)
В примера са спазени всички правила за сериализация описани по-горе.
26 Версии при сериализация. Работа с указатели към обекти и проблеми при използване на псевдоними на обекти при сериализация.
Когато работим с различни версии ни трябва да предвидим код в Serialize().Интересна е и още една особеност: Предефинирането работи за указатели към такива обекти-наследници, а не за самите обекти. Така че:
CLine* pLine = new CLine( CPoint( 0,0), CPoint( 40,40));
ar << pLine; //работи добре
CLine line( CPoint( 0,0), CPoint( 40,40));
ar << line; // няма да работи
Aко искаме да сериализираме по стойност, а не по указател, е добре така:
CLine line( CPoint( 0,0), CPoint( 40,40));
ar << &line; // ще работи за сериализация
при десериализация:
CLine* pLine;
ar >> pLine; //всичко е добре
CLine line = *pLine; // операция = е предеф. в CLine като копиране
delete pLine; // вече ненужен
Тагове от реферата: сериаия, поддърж, собвени, съзне











