Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pro serializaci třídy je zapotřebí pět hlavních kroků. Jsou uvedené níže a jsou vysvětlené v následujících částech:
Odvození třídy z objektu CObject (nebo z některé třídy odvozené od
CObject).Na použití makra DECLARE_SERIAL v deklaraci třídy.
Použití makra IMPLEMENT_SERIAL v implementačním souboru pro vaši třídu.
Pokud voláte Serialize přímo namísto prostřednictvím operátorů >> a <<CArchive, poslední tři kroky nejsou pro serializaci vyžadovány.
Odvození třídy z objektu CObject
Základní serializační protokol a funkce jsou definovány ve CObject třídě. Odvozením vaší třídy z CObject (nebo z třídy odvozené z CObject), jak je znázorněno v následující deklaraci třídy CPerson, získáte přístup k serializačnímu protokolu a funkčnosti CObject.
Přepsání členské funkce serializace
Členská funkce Serialize, která je definována ve třídě CObject, je zodpovědná za skutečnou serializaci dat potřebných k zachycení aktuálního stavu objektu. Funkce Serialize má CArchive argument, který používá ke čtení a zápisu dat objektu.
CArchive objekt má členovou funkci, která označuje, IsStoringzda Serialize je ukládání (zápis dat) nebo načítání (čtení dat). Pomocí výsledků jako vodítka IsStoring vložíte data objektu CArchive do objektu pomocí operátoru vložení (<<) nebo extrahujete data pomocí operátoru extrakce (>>).
Představte si třídu, která je odvozena z CObject a má dvě nové členské proměnné, typy CString a WORD. Následující fragment deklarace třídy ukazuje nové členské proměnné a deklaraci pro přepsanou Serialize členskou funkci:
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 členskou funkci Serializovat
Zavolejte verzi
Serializezákladní třídy, abyste se ujistili, že děděná část objektu je serializována.Vložte nebo extrahujte členské proměnné specifické pro vaši třídu.
Operátory vložení a extrakce komunikují s archivní třídou ke čtení a zápisu dat. Následující příklad ukazuje, jak implementovat
SerializeproCPersontřídu deklarovanou 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 také použít členské funkce CArchive::Read a CArchive::Write pro čtení a zápis velkých objemů nezatypovaných dat.
Použití makra DECLARE_SERIAL
Makro DECLARE_SERIAL je vyžadováno v deklaraci tříd, které budou podporovat serializaci, jak je znázorněno zde:
class CPerson : public CObject
{
public:
DECLARE_SERIAL(CPerson)
Definování konstruktoru bez argumentů
MFC vyžaduje výchozí konstruktor při opětovném vytvoření objektů, protože jsou deserializovány (načteny z disku). Proces deserializace vyplní všechny členské proměnné hodnotami potřebnými k opětovnému vytvoření objektu.
Tento konstruktor může být deklarován jako veřejný, chráněný nebo soukromý. Pokud ji nastavíte jako chráněnou nebo soukromou, pomůže vám zajistit, aby ji používaly pouze funkce serializace. Konstruktor musí umístit objekt do stavu, který umožňuje jeho odstranění v případě potřeby.
Poznámka:
Pokud zapomenete definovat konstruktor bez argumentů ve třídě, která používá DECLARE_SERIAL a IMPLEMENT_SERIAL makra, zobrazí se na řádku, kde se používá makro IMPLEMENT_SERIAL, upozornění kompilátoru bez výchozího konstruktoru.
Použití makra IMPLEMENT_SERIAL v souboru implementace
Makro IMPLEMENT_SERIAL slouží k definování různých funkcí potřebných při odvození serializovatelné třídy z CObject. Toto makro použijete v souboru implementace (. CPP) pro vaši třídu. První dva argumenty makra jsou název třídy a název jeho bezprostřední základní třídy.
Třetím argumentem tohoto makra je číslo schématu. Číslo schématu je v podstatě číslo verze pro objekty třídy. Pro číslo schématu použijte celé číslo větší nebo rovno 0. (Nezaměňujte toto číslo schématu s terminologií databáze.)
Kód serializace MFC kontroluje číslo schématu při čtení objektů do paměti. Pokud číslo schématu objektu na disku neodpovídá číslu schématu třídy v paměti, knihovna vyvolá CArchiveExceptionvýjimku , což programu brání v čtení nesprávné verze objektu.
Pokud chcete, aby vaše Serialize členová funkce mohla číst více verzí – to znamená soubory napsané s různými verzemi aplikace – můžete použít hodnotu VERSIONABLE_SCHEMA jako argument pro IMPLEMENT_SERIAL makro. Informace o využití a příklad naleznete v GetObjectSchema členské funkci třídy CArchive.
Následující příklad ukazuje, jak použít IMPLEMENT_SERIAL pro třídu, CPersonkterá je odvozena z CObject:
IMPLEMENT_SERIAL(CPerson, CObject, 1)
Jakmile máte serializovatelnou třídu, můžete serializovat objekty třídy, jak je popsáno v článku Serializace: Serializace objektu.