Szerializálás: Szerializálható osztály létrehozása

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Az osztály szerializálhatóvá tételéhez öt fő lépés szükséges. Ezeket alább találja, és a következő szakaszokban ismertetjük őket:

  1. Az osztály származtatása a CObjectből (vagy egy abból származtatott osztályból CObject).

  2. A szerializálási tagfüggvény felülírása.

  3. A DECLARE_SERIAL makró használata az osztálydeklarációban.

  4. Argumentumok nélküli konstruktor definiálása.

  5. A IMPLEMENT_SERIAL makró használata az osztály implementációs fájljában .

Ha közvetlenül a Serialize hívja meg ahelyett, hogy az >><< és operátorain keresztül tenné, a szerializáláshoz nem szükséges az utolsó három lépés.

Az osztály származtatása a CObjectből

Az alapvető szerializálási protokoll és funkciók az CObject osztályban vannak definiálva. Ha az osztályt úgy származtatja CObject-ból vagy egy abból származtatott osztályból CObject, ahogyan az a következő CPerson osztály deklarációjában látható, hozzáférhet a CObject szerializálási protokolljához és funkcionalitásához.

A szerializálási tagfüggvény felülírása

Az Serialize osztályban CObject definiált tagfüggvény felelős az objektumok aktuális állapotának rögzítéséhez szükséges adatok szerializálásáért. A Serialize függvény argumentuma CArchive az objektumadatok olvasására és írására használható. A CArchive objektumnak van egy tagfüggvénye, amely jelzi, hogy IsStoring az adatok tárolása (adatok írása) vagy betöltése (adatok olvasása) történik-e. Az eredmények útmutatóként való IsStoring használatával beszúrhatja az objektum adatait az objektumba a CArchive beszúrási operátorral (<<) vagy kinyerheti az adatokat a kinyerési operátorral (>>).

Tekintsünk egy osztályt, amely a CObject osztályból származik, és két új tagváltozóval rendelkezik, amelyek típusai CString és WORD. Az alábbi osztálydeklarációs töredék az új tagváltozókat és a felülrendelt Serialize tagfüggvény deklarációját mutatja be:

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);
};

A szerializálási tagfüggvény felülbírálása

  1. Hívja meg az alaposztály verzióját Serialize, hogy megbizonyosodjon arról, az objektum örökölt része szerializálva van.

  2. Szúrja be vagy bontsa ki az osztályra jellemző tagváltozókat.

    A beszúrási és kinyerési operátorok az archív osztályt használják az adatok olvasásához és írásához. Az alábbi példa bemutatja, hogyan implementálható Serialize a CPerson fent deklarált osztály:

    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;
    }
    

Használhatja a CArchive::Read és a CArchive::Write tagfüggvényeket is nagymennyiségű nem típusosított adat olvasására és írására.

A DECLARE_SERIAL makró használata

A szerializálást támogató osztályok deklarációjában szükség van a DECLARE_SERIAL makróra, ahogy az itt látható:

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

Konstruktor definiálása argumentumok nélkül

Az MFC-hez alapértelmezett konstruktorra van szükség ahhoz, hogy az objektumokat újra létre tudja hozni a deszerializáláskor (amikor lemezről vannak betöltve). A deszerializálási folyamat az összes tagváltozót kitölti az objektum újbóli létrehozásához szükséges értékekkel.

Ez a konstruktor nyilvános, védett vagy privát deklarálható. Ha védetté vagy priváttá teszi, azzal biztosítja, hogy azt csak a szerializálási függvények fogják használni. A konstruktornak olyan állapotba kell helyeznie az objektumot, amely lehetővé teszi, hogy szükség esetén törölhető legyen.

Megjegyzés:

Ha elfelejt argumentumok nélküli konstruktort definiálni egy olyan osztályban, amely a DECLARE_SERIAL és IMPLEMENT_SERIAL makrókat használja, a IMPLEMENT_SERIAL makrót használó sorban megjelenik egy "nincs alapértelmezett konstruktor elérhető" fordító figyelmeztetés.

A IMPLEMENT_SERIAL makró használata a implementálási fájlban

A IMPLEMENT_SERIAL makró a szerializálható osztály CObjectszármaztatásához szükséges különböző függvények meghatározására szolgál. Az implementálási fájlban (.CPP) az osztályához használja ezt a makrót. A makró első két argumentuma az osztály neve és a közvetlen alaposztály neve.

A makró harmadik argumentuma egy sémaszám. A sémaszám lényegében az osztály objektumainak verziószáma. A sémaszámhoz használjon 0-nál nagyobb vagy egyenlő egész számot. (Ne keverje össze ezt a sémaszámot az adatbázis terminológiájával.)

Az MFC szerializálási kód ellenőrzi a séma számát, amikor objektumokat olvas a memóriába. Ha a lemezen lévő objektum sémaszáma nem egyezik meg a memóriában lévő osztály sémaszámával, a kódtár egy olyan hibát fog eredményezni CArchiveException, amely megakadályozza, hogy a program helytelen verziójú objektumot olvasson.

Ha azt szeretné, hogy a Serialize tagfüggvény több verziót – vagyis az alkalmazás különböző verzióival írt fájlokat – tudjon olvasni, akkor a VERSIONABLE_SCHEMA értéket a IMPLEMENT_SERIAL makró argumentumaként használhatja. A használati információkért és egy példaért tekintse meg az GetObjectSchema osztály CArchivetagfüggvényét.

Az alábbi példa bemutatja, hogyan használható IMPLEMENT_SERIAL egy osztályhoz, CPersonamely a következőből CObjectszármazik:

IMPLEMENT_SERIAL(CPerson, CObject, 1)

Miután rendelkezik szerializálható osztálysal, szerializálhatja az osztály objektumait, amint azt a Szerializálás: Objektum szerializálása című cikkben tárgyaltuk.

Lásd még

Szerializálás