Sdílet prostřednictvím


Serializace: Vytváření serializovatelné třídy

Pět hlavní kroky nutné k serializovatelné třídy.Jsou uvedeny a popsány v následujících částech:

  1. Třídy odvozené od CObject (nebo z některé třídy odvozené od CObject).

  2. Potlačení členské funkce Serialize.

  3. Použití maker DECLARE_SERIAL v deklaraci třídy.

  4. Definování, nevyžaduje žádné argumenty konstruktoru.

  5. V provádění souboru pomocí maker IMPLEMENT_SERIAL pro třídu.

Při volání Serialize přímo a nikoli až >> a << provozovatelé CArchive, poslední tři kroky nejsou vyžadovány pro serializaci.

Třídy odvozené od CObject

Serializace základní protokol a funkce, které jsou definovány v CObject třídy.Podle odvození třídy z CObject (nebo z třídy odvozené od CObject), jak je znázorněno v následující deklaraci třídy CPerson, získat přístup k protokolu serializace a funkce CObject.

Potlačení serializovat členské funkce

Serialize Členské funkce, která je definována CObject třídy, je odpovědný za skutečně serializaci dat nutné zachytit aktuální stav objektu.Serialize Funkce má CArchive argument, který se používá pro čtení a zápis dat objektu.CArchive objekt má členské funkce IsStoring, což znamená, zda Serialize je ukládání (zápis dat) nebo načítání (čtení dat).Pomocí výsledků IsStoring jako vodítko, můžete buď vložit data do objektu CArchive objektu s operátorem kurzoru (<<) nebo extrahovat data s operátorem extrakce (>>).

Zvažte, který je odvozen od třídy CObject a má dvě nové proměnné členů typů CString a WORD.Následující prohlášení fragmentu třídy ukazuje nové členské proměnné a prohlášení lokálně 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 );
};

Potlačit členské funkce Serialize

  1. Volání třídy základní verzi Serialize a ujistěte se, že je serializován zděděné část objektu.

  2. Vložit nebo vyjmout určité třídy proměnné členů.

    Vložení a extrakce operátory interakci s třídy archivu číst a zapisovat data.Následující příklad ukazuje, jak implementovat Serialize pro CPerson deklaraci třídy nad:

    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 CArchive::Read a CArchive::Write funkce členů ke čtení a zápisu velkého množství dat bez typu.

Použití maker DECLARE_SERIAL

DECLARE_SERIAL Makro je požadováno v deklaraci třídy, které bude podporovat serializace, jak je znázorněno zde:

class CPerson : public CObject
{
public:
    DECLARE_SERIAL( CPerson )

Definování konstruktor bez argumentů

MFC vyžaduje výchozí konstruktor jej znovu vytvoří objekty, jako jsou rekonstruovat, (načten z disku).Proces rekonstrukce bude vyplnit všechny členské proměnné hodnoty požadované znovu vytvořit objekt.

Soukromé, chráněný nebo veřejný, lze tento konstruktor deklarovat.Pokud je chráněný nebo soukromý, Nápověda, ujistěte se, že ji budou používat pouze funkce serializace.Konstruktor musí umístit objekt ve stavu, který umožňuje, aby v případě potřeby odstraněny.

[!POZNÁMKA]

Pokud jste zapomněli definovat konstruktor bez argumentů ve třídě, která se používá DECLARE_SERIAL a IMPLEMENT_SERIAL makra, obdržíte upozornění kompilátoru "výchozí konstruktor k dispozici" v řádku kde IMPLEMENT_SERIAL makro.

Pomocí IMPLEMENT_SERIAL makra v souboru implementace

IMPLEMENT_SERIAL Makro se používá k definování různých funkcí potřebných při můžete odvodit serializovatelné třídy z CObject.Použít toto makro v provádění souboru (.CPP) pro třídu.První dva argumenty makra jsou název třídy a jeho okamžité základní třída.

Toto makro třetí argument je číslo schématu.Číslo schématu je v podstatě číslo verze pro objekty této třídy.Používejte schéma číslo celé číslo větší nebo rovna 0.(Nezaměňujte číslo tohoto schématu s databázové terminologii.)

Kód serializace MFC zkontroluje číslo schématu při čtení objektů do paměti.Pokud číslo schématu objektu na disku neodpovídá schématu číslo třídy v paměti, bude vyvolána knihovny CArchiveException, brání programu pro čtení nesprávná verze objektu.

Chcete-li vaše Serialize členské funkce číst více verzí –, soubory zapsané v různých verzích aplikace – můžete použít hodnotu VERSIONABLE_SCHEMA jako argument IMPLEMENT_SERIAL makro.Informace o použití a příklady naleznete GetObjectSchema členské funkce třídy CArchive.

Následující příklad ukazuje použití IMPLEMENT_SERIAL pro třídu, CPerson, je odvozen z CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Jakmile serializovatelné třídy lze serializovat objekty třídy, jak je popsáno v článku serializace: serializaci objektu.

Viz také

Koncepty

Serializace v MFC