Serialization: Making a Serializable-Klasse

Fünf wichtigsten Schritte sind erforderlich, um eine Klasse serialisierbar zu machen.Sie sind im Folgenden aufgeführt und erläutert in den folgenden Abschnitten:

  1. Ableiten der Klasse von CObject (bzw. einiger Klasse abgeleitet von CObject).

  2. Die serialisierens Memberfunktion einer überschreiben.

  3. Verwenden des DECLARE_SERIAL-Makros in der Klassendeklaration.

  4. Definieren eines Konstruktor, der keine Argumente akzeptiert.

  5. Verwenden des IMPLEMENT_SERIAL-Makros in der Implementierungsdatei für die Klasse.

Wenn Sie Serialize anstatt direkt von der >> << und Operatoren von CArchive aufrufen, werden die letzten drei Schritte nicht für die Serialisierung erforderlich.

Ableiten der Klasse von CObject

Das einfache Serialisierung Authentifizierungsprotokoll und - Funktionen werden in der CObject-Klasse definiert.Indem Sie die Klasse von CObject (oder von einer Klasse abgeleitet von CObject), wie in der folgenden Deklaration der Klasse ableiten, erhalten Sie CPerson gezeigt auf das Authentifizierungsprotokoll Serialisierungsinformationen und der Funktionalität von CObject zugreifen.

Die serialisierens-Memberfunktion überschreiben

Die Serialize-Memberfunktion, die in der CObject-Klasse definiert wird, ist für die Serialisierung tatsächlich Daten verantwortlich, die erforderlich sind, um den aktuellen Zustand eines Objekts zu erfassen.Die Serialize Die Funktion hat ein CArchive-Argument, das verwendet wird, um sie zu lesen und schreibt die Objektdaten.Das CArchive-Objekt verfügt über eine Memberfunktion, IsStoring, die angibt, ob Serialize Schreiben von Daten (Speichern) oder Laden (Lesen von Daten).Verwenden von Ergebnissen IsStoring als Leitfaden, fügen Sie entweder die Daten des Objekts im CArchive-Objekt mit den Daten zum Einfügen des Operators (<<) oder auszuges mit dem Extraktions ein Operator (>>).

Betrachten Sie eine Klasse, die von CObject abgeleitet ist und zwei neue Membervariablen wurde, Typen CString und WORD.Im folgenden Klassendeklarations fragment werden die neuen Membervariablen und die Deklaration für die überschriebene Serialize-Memberfunktion auf:

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

So überschreiben Sie die Memberfunktion einer serialisierens

  1. Rufen Sie die Basisklassenversion von Serialize an, um zu überprüfen, ob der geerbten Teil des Objekts serialisiert werden soll.

  2. Fügen Sie ein oder Extrahieren Sie die Membervariablen, die der Klasse spezifisch sind.

    Bei Einfügungs- und Operatoren Extraktions Interaktion mit dem Archiv Klasse, um die Daten zu lesen und zu schreiben.Im folgenden Beispiel wird gezeigt, wie Serialize für die CPerson-Klasse implementiert, die deklariert werden soll:

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

Sie können die CArchive::Read und CArchive::Write-Memberfunktionen auch verwenden, um große Mengen an der nicht typisierte Daten zu lesen und zu schreiben.

Verwenden des DECLARE_SERIAL-Makros

Das Makro ist DECLARE_SERIAL in der Deklaration von Klassen, die Serialisierung unterstützen, wie hier gezeigt erforderlich:

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

Definieren eines Konstruktor ohne Argumente

MFC benötigt einen Standardkonstruktor, wenn die Objekte neu erstellt, während sie deserialisiert wurden (vom Datenträger geladen.)Der Deserialisierungsvorgang füllt alle Membervariablen mit den Werten aus, um das Objekt neu erstellt werden müssen.

Dieser Konstruktor kann als öffentlich deklariert werden, geschützt oder privat.Wenn Sie den Bericht ausführen oder privat, geschützt, können Sie sicherstellen, dass er nur Funktionen durch die Serialisierungsinfrastruktur verwendet wird.Der Konstruktor muss das Objekt in einen Zustand ggf. ablegen, der gelöscht werden soll, es kann.

HinweisHinweis

Wenn Sie vergessen, einen Konstruktor ohne Argumente in einer Klasse definieren, die die DECLARE_SERIAL und IMPLEMENT_SERIAL Makros verwendet, rufen Sie eine verfügbare "none" Compilerwarnung des Standardkonstruktors in der Zeile ab, in der das IMPLEMENT_SERIAL Makro verwendet wird.

Verwenden des IMPLEMENT_SERIAL-Makros in der Implementierungsdatei

Das Makro IMPLEMENT_SERIAL werden die verschiedenen Funktionen benötigen, wenn Sie eine serialisierbare Klasse von CObject berechnen.Sie verwenden dieses Makro in der Implementierungsdatei (.CPP) für die Klasse.Die ersten beiden Argumente an das Makro sind der Name der Klasse und den Namen seiner unmittelbaren Basisklasse.

Das dritte Argument für dieses Makro handelt es sich um eine Nummer des Schemas.Die Nummer des Schemas ist im Wesentlichen eine Versionsnummer für Objekte der Klasse.Verwenden Sie eine ganze Zahl größer oder gleich 0 für die Nummer des Schemas.(Verwechseln Sie diese Nummer des Schemas nicht mit Datenbank terminologie).

Die MFC-Serialisierungs code-überprüfungen die Nummer des Schemas, wenn Objekte in den Arbeitsspeicher gelesen werden.Wenn die Nummer des Schemas des Objekts auf dem Datenträger nicht die Nummer des Schemas der Klasse im Arbeitsspeicher passt, löst die Bibliothek CArchiveException und verhindert, dass das Programm beim Lesen einer falschen Version des Objekts.

Wenn Sie die Serialize-Memberfunktion in der Lage sein sollen, mehrere Versionen zu lesen, d. h. die Dateien geschrieben in verschiedenen Versionen der Anwendung, können Sie den Wert VERSIONABLE_SCHEMA als Argument an den IMPLEMENT_SERIAL Makro verwenden.So verwenden Sie Informationen und ein Beispiel finden Sie in der GetObjectSchema-Memberfunktion der Klasse CArchive.

Im folgenden Beispiel wird gezeigt, wie IMPLEMENT_SERIAL für eine Klasse, CPerson verwendet, die von CObject abgeleitet wurde:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Nachdem Sie eine serialisierbare Klasse haben, können Sie Objekte der Klasse serialisiert, wie im Artikel Serialisierung: Ein Objekt serialisieren erläutert.

Siehe auch

Konzepte

Serialisierung in MFC