Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Fem huvudsteg krävs för att göra en klass serialiserbar. De visas nedan och förklaras i följande avsnitt:
Härled klassen från CObject (eller från någon klass som härletts från
CObject).Använda DECLARE_SERIAL makrot i klassdeklarationen.
Använda IMPLEMENT_SERIAL makrot i implementeringsfilen för klassen.
Om du anropar Serialize direkt i stället för via operatorerna >> och << för CArchive krävs inte de tre sista stegen för serialisering.
Att härleda din egen klass från CObject
Det grundläggande serialiseringsprotokollet och funktionerna definieras i CObject klassen. Genom att härleda din klass från CObject (eller från en klass som härletts från CObject), enligt följande deklaration av klassen CPersonfår du åtkomst till serialiseringsprotokollet och funktionerna CObjecti .
Åsidosätta funktionen Serialisera medlem
Medlemsfunktionen Serialize , som definieras i CObject klassen, ansvarar för att faktiskt serialisera de data som krävs för att avbilda ett objekts aktuella tillstånd. Funktionen Serialize har ett CArchive argument som används för att läsa och skriva objektdata.
CArchive-objektet har en medlemsfunktion, IsStoring, som anger om Serialize den lagrar (skriver data) eller läser in (läser data). Med hjälp av resultatet av IsStoring som en guide infogar du antingen objektets data i CArchive objektet med infogningsoperatorn (<<) eller extraherar data med extraheringsoperatorn (>>).
Överväg en klass som härleds från CObject och har två nya medlemsvariabler, av typer CString och WORD. Följande klassdeklarationsfragment visar de nya medlemsvariablerna och deklarationen för den åsidosatta Serialize medlemsfunktionen:
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);
};
Så här åsidosätter du funktionen Serialisera medlem
Anropa basklassversionen av
Serializeför att se till att den ärvda delen av objektet serialiseras.Infoga eller extrahera de medlemsvariabler som är specifika för din klass.
Infognings- och extraheringsoperatorerna interagerar med arkivklassen för att läsa och skriva data. I följande exempel visas hur du implementerar
Serializeför klassenCPersonsom deklareras ovan: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; }
Du kan också använda funktionerna CArchive::Read och CArchive::Write för att läsa och skriva stora mängder otypade data.
Använda makrot DECLARE_SERIAL
Det DECLARE_SERIAL makrot krävs i deklarationen av klasser som stöder serialisering, enligt följande:
class CPerson : public CObject
{
public:
DECLARE_SERIAL(CPerson)
Definiera en konstruktor utan argument
MFC kräver en standardkonstruktor när de återskapar dina objekt eftersom de deserialiseras (läses in från disk). Deserialiseringsprocessen fyller i alla medlemsvariabler med de värden som krävs för att återskapa objektet.
Konstruktorn kan deklareras som offentlig, skyddad eller privat. Om du gör den skyddad eller privat ser du till att den endast används av serialiseringsfunktionerna. Konstruktorn måste placera objektet i ett tillstånd som gör att det kan tas bort om det behövs.
Anmärkning
Om du glömmer att definiera en konstruktor utan argument i en klass som använder DECLARE_SERIAL och IMPLEMENT_SERIAL makron får du en kompilatorvarning "ingen tillgänglig standardkonstruktor" på raden där det IMPLEMENT_SERIAL makrot används.
Använda makrot IMPLEMENT_SERIAL i implementeringsfilen
Makrot IMPLEMENT_SERIAL används för att definiera de olika funktioner som behövs när du härleder en serialiserbar klass från CObject. Du använder det här makrot i implementeringsfilen (. CPP) för din klass. De två första argumenten i makrot är namnet på klassen och namnet på dess omedelbara basklass.
Det tredje argumentet i makrot är ett schemanummer. Schemanumret är i princip ett versionsnummer för objekt i klassen. Använd ett heltal som är större än eller lika med 0 för schemanumret. (Blanda inte ihop det här schemanumret med databasterminologi.)
MFC-serialiseringskoden kontrollerar schemanumret när objekt läss in i minnet. Om schemanumret för objektet på disken inte matchar schemanumret för klassen i minnet, genererar biblioteket ett CArchiveException, vilket hindrar programmet från att läsa en felaktig version av objektet.
Om du vill att medlemsfunktionen Serialize ska kunna läsa flera versioner , det vill: filer som skrivits med olika versioner av programmet, kan du använda värdet VERSIONABLE_SCHEMA som ett argument till IMPLEMENT_SERIAL makro. Information om användning och ett exempel finns i medlemsfunktionen för GetObjectSchema klassen CArchive.
I följande exempel visas hur du använder IMPLEMENT_SERIAL för en klass, , CPersonsom härleds från CObject:
IMPLEMENT_SERIAL(CPerson, CObject, 1)
När du har en serialiseringsbar klass kan du serialisera objekt i klassen enligt beskrivningen i artikeln Serialisering: Serialisera ett objekt.