Serializace: Příprava serializovatelné třídy
Pět hlavních kroků nutné třída serializovatelný.Jsou uvedeny a vysvětleny v následujících částech:
Třídy odvozené od třídy CObject (nebo z některé třídy odvozené z CObject).
Přepsat členské funkce serializovatelnou.
Pomocí makra DECLARE_SERIAL v deklaraci třídy.
Definování konstruktor, který nepřijímá žádné argumenty.
Do implementačního souboru pomocí makra IMPLEMENT_SERIAL pro svou třídu.
Pokud zavoláte Serialize přímo a nikoli až >> a << provozovatelé CArchive, poslední tři kroky nejsou vyžadovány pro serializaci.
Třídy odvozené od třídy CObject
Základní serializace protokol a funkce, které jsou definovány v CObject třídy.V odvozené třídě z CObject (nebo z odvozené třídy z CObject), jak je znázorněno na následující deklaraci třídy CPerson, můžete získat přístup k protokolu serializace a funkce CObject.
Přepsání serializovat členské funkce
Serialize Členské funkce, která je definována v CObject třídy, je zodpovědný za skutečně serializaci dat nutné zachytit aktuální stav objektu.Serialize Funkce má CArchive argument, který se používá ke čtení a zápisu dat objektu.CArchive objekt má členskou funkci IsStoring, což znamená, zda Serialize je ukládání (zápis dat) nebo načítání (čtení dat).Výsledky IsStoring jako vodítko, můžete buď vložit data do objektu v CArchive operátor vkládání objektů (<<) nebo extrahovat data s operátorem extrakce (>>).
Zvažte třídy, která je odvozena z CObject a má dvě nové členské proměnné, typy CString a slova.Následující deklarace třídy fragment ukazuje nové členské proměnné a prohlášení pro přepsané Serialize členské funkce:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
// empty constructor is necessary
CPerson();
virtual ~CPerson();
CString m_name;
WORD m_number;
void Serialize( CArchive& archive );
};
Přepsat členské funkce serializovatelnou
Verze základní třídy volání Serialize a ujistěte se, že je serializován zděděné části objektu.
Vložit nebo vyjmout členské proměnné, které jsou specifické pro vaši třídu.
Vložení a vytěžování operátorů spolupracovat s archivaci třídy číst a zapisovat data.Následující příklad ukazuje, jak implementovat Serialize k CPerson třída deklarována výše:
void CPerson::Serialize( CArchive& archive ) { // call base class function first // base class is CObject in this case CObject::Serialize( archive ); // now do the stuff for our specific class if( archive.IsStoring() ) archive << m_name << m_number; else archive >> m_name >> m_number; }
Můžete použít také CArchive::Read a CArchive::Write členské funkce pro čtení a zápis bez udaného typu dat velké množství.
Pomocí makra DECLARE_SERIAL
DECLARE_SERIAL Makro je požadováno v deklaraci třídy, které podporují serializaci, jak je znázorněno zde:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
Definování konstruktor bez argumentů
Knihovna MFC vyžaduje výchozí konstruktor znovu vytvoří objekty jako jsou rekonstruovat, (načten z disku).Proces rekonstrukce vyplní všechny členské proměnné s hodnotami, které jsou nutné k opětovnému vytvoření objektu.
Tento konstruktor lze deklarovat veřejné, chráněný nebo soukromý.Pokud je chráněný nebo soukromý, Nápověda, ujistěte se, že ji bude používána pouze funkce serializace.Konstruktor musí umístit objekt ve stavu, který umožňuje v případě potřeby odstranit.
[!POZNÁMKA]
Pokud jste zapomněli definovat třídu, která používá konstruktor bez argumentů DECLARE_SERIAL a IMPLEMENT_SERIAL makra, zobrazí se upozornění kompilátoru "žádný výchozí konstruktor k dispozici" v řádku kde IMPLEMENT_SERIAL makro.
Pomocí makra IMPLEMENT_SERIAL do implementačního souboru
IMPLEMENT_SERIAL Makro se používá k definování různých funkcí, třeba Když odvodíte serializovatelné třídy z CObject.Použítí toto makra v souboru implementace (.CPP) pro vaši třídu.První dva argumenty makra jsou název třídy a název jeho přímé základní třídy.
Třetí argument toto makro je číslo schématu.Číslo schématu je v podstatě číslo verze pro objekty třídy.Pro číslo schématu pomocí celé číslo větší než nebo roven 0. (Nezaměňujte číslo tohoto schématu s terminologií databáze.)
Serializace kódu knihovny MFC zkontroluje číslo schématu při čtení objektů do paměti.Pokud číslo schématu objektu na disku neodpovídá číslo schématu třídy v paměti, vyvolá v knihovně CArchiveException, brání čtení objektu nesprávnou verzi programu.
Chcete-li vaše Serialize členské funkce bude moci přečíst více verzí –, soubory zapsané v různých verzích aplikace – můžete použít hodnotu VERSIONABLE_SCHEMA jako argument IMPLEMENT_SERIAL makra.Informace o použití a příklad naleznete v tématu GetObjectSchema členské funkce třídy CArchive.
Následující příklad ukazuje, jak použít IMPLEMENT_SERIAL pro třídu CPerson, který je odvozen z CObject:
IMPLEMENT_SERIAL( CPerson, CObject, 1 )
Jakmile máte serializovatelné třídy, jak je popsáno v článku můžete serializovat objekty třídy, serializace: serializace objektu.