Udostępnij za pośrednictwem


Serializacji: Tworzenie klasy można serializować.

Pięć głównych kroków są zobowiązane do udostępniania klasy możliwy do serializacji.Są one wymienione poniżej i wyjaśnione w następujących sekcjach:

  1. Klasy wywodzące się z CObject (lub niektóre klasy pochodne CObject).

  2. Przesłanianie funkcji składowej Serialize.

  3. Korzystanie z makra DECLARE_SERIAL w deklaracji klasy.

  4. Definiowanie konstruktora, który nie przyjmuje żadnych argumentów.

  5. Korzystanie z makra IMPLEMENT_SERIAL w pliku implementacji dla swojej klasy.

Jeśli zadzwonisz Serialize bezpośrednio, a nie do >> i << Operatorzy CArchive, ostatnie trzy kroki nie są wymagane do serializacji.

Klasy wywodzące się z CObject

Protokół serializacji podstawowe i funkcje są zdefiniowane w CObject klasy.Przez wynikające z klasy CObject (lub z klasy pochodzącej od CObject), jak pokazano w następującej deklaracji klasy CPerson, uzyskać dostęp do serializacji protokołu i funkcjonalność CObject.

Przesłanianie serializować funkcji składowej

Serialize Członkowskich funkcji, która jest zdefiniowana w CObject klasy, jest odpowiedzialna za faktycznie szeregowania danych koniecznych do przechwytywania bieżący stan obiektu.Serialize Funkcja ma CArchive argument, używany do odczytu i zapisu danych obiektu.CArchive obiekt ma funkcję Członkowskie IsStoring, która wskazuje czy Serialize jest przechowywanie (zapisywania danych) lub załadunku (Czytanie danych).Za pomocą wyników IsStoring jako przewodnik, albo wstawiania danych na obiekt w CArchive obiektu z operatorem wstawiania (<<) lub wyodrębnienia danych z operatorem ekstrakcji (>>).

Należy wziąć pod uwagę klasy pochodzącej z CObject i ma dwie nowe zmienne składowe, typów CString i program WORD.Poniższy fragment deklarację klasy pokazuje nowego członka, zmiennych i deklaracji przez przesłoniętymi Serialize Członkowskich funkcji:

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

Aby zastąpić funkcji składowej Serialize

  1. Wywołanie klasy podstawowej wersji Serialize , aby upewnić się, że część dziedziczonych obiektu jest seryjny.

  2. Wstawianie lub wyodrębnienia zmienne składowe specyficzne dla swojej klasy.

    Operatory wstawiania i ekstrakcji interakcji z klasy archiwum do odczytu i zapisu danych.Poniższy przykład pokazuje, jak zaimplementować Serialize do CPerson klasy zadeklarowane powyżej:

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

Można również użyć CArchive::Read i CArchive::Write funkcji elementów członkowskich do odczytu i zapisu dużych ilości danych bez typu.

Korzystanie z makra DECLARE_SERIAL

DECLARE_SERIAL Makro jest wymagane w deklaracji klasy obsługujących serializacji, jak pokazano poniżej:

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

Definiowanie konstruktora bez argumentów

MFC wymaga domyślnego konstruktora przy ponownym obiekty, jak są one rozszeregować (załadowany z dysku).W procesie rozszeregowania wypełni wszystkie zmienne z wartości wymagane ponowne utworzenie obiektu.

Ten konstruktor może być deklarowana publicznych, chronionych lub prywatnych.Jeśli będzie to chronionych lub prywatnych, pomoc upewnij się, że będzie ono jedynie być wykorzystane przez funkcje serializacji.Konstruktor musi umieścić obiekt w stanie umożliwiającym usunięty, jeśli jest to konieczne.

[!UWAGA]

Jeśli zapomnisz określić konstruktora bez argumentów w klasie, która korzysta z DECLARE_SERIAL i IMPLEMENT_SERIAL makra, zostanie wyświetlone ostrzeżenie kompilatora "Brak domyślnego konstruktora dostępne" w wierszu gdzie IMPLEMENT_SERIAL makro jest używany.

Korzystanie z makra IMPLEMENT_SERIAL w pliku implementacji

IMPLEMENT_SERIAL Makro jest używany do definiowania różnych funkcji, potrzebne podczas możesz wynikają możliwy do serializacji klasy z CObject.Użyj tego makra w pliku implementacji (.CPP) dla swojej klasy.Pierwsze dwa argumenty makra są nazwa klasy i nazwa jego natychmiastowego klasy podstawowej.

Trzeci argument to makro jest numer schematu.Numer schematu jest zasadniczo numer wersji dla obiektów tej klasy.Należy użyć numeru schematu liczbą całkowitą większą niż lub równa 0.(Nie należy mylić tej liczby schematu z terminologią bazy danych.)

Kod serializacji MFC sprawdza numer schematu podczas czytania obiektów do pamięci.Jeśli numer schematu obiektu na dysku nie pasuje numer schematu klasy w pamięci, wygeneruje biblioteki CArchiveException, uniemożliwienie odczytu Nieprawidłowa wersja obiektu programu.

Jeśli Twoje Serialize funkcji składowej, aby móc odczytać wiele wersji — oznacza to, że pliki zapisane w różnych wersjach aplikacji — można użyć wartości VERSIONABLE_SCHEMA jako argument do IMPLEMENT_SERIAL makro.Informacje o sposobie użycia i przykładem, zobacz GetObjectSchema funkcji składowej klasy CArchive.

Poniższy przykład pokazuje, jak używać IMPLEMENT_SERIAL dla klasy, CPerson, czyli pochodzące z CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Po utworzeniu klasy można serializować można serializować obiektów klasy, omówionego w artykule serializacji: szeregowania obiektu.

Zobacz też

Koncepcje

Serializacja w MFC