Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
Az osztály származtatása a CObjectből (vagy egy abból származtatott osztályból
CObject).A DECLARE_SERIAL makró használata az osztálydeklarációban.
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
Hívja meg az alaposztály verzióját
Serialize, hogy megbizonyosodjon arról, az objektum örökölt része szerializálva van.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ó
SerializeaCPersonfent 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.