Udostępnij za pośrednictwem


Serializacja: ustawianie klasy jako możliwej do serializacji

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

  1. Wynikające z klasy CObject (lub niektóre klasy pochodzące z CObject).

  2. Przesłanianie funkcji członka seryjne.

  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 do Serialize bezpośrednio, a nie do >> i << Operatorzy CArchive, ostatnie trzy kroki nie są wymagane do serializacji.

Wynikające z klasy CObject

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

Przesłanianie serializacji funkcji członka

Serialize Funkcji składowej, która jest zdefiniowana w CObject klasę, jest odpowiedzialny za faktycznie szeregowania danych niezbędnych do przechwytywania bieżący stan obiektu.Serialize Funkcja ma CArchive argument, że wykorzystuje do odczytywania i zapisywania danych obiektu.CArchive obiekt ma funkcję członka IsStoring, która wskazuje, czy Serialize jest przechowywanie (zapisywania danych) lub ładowania (Odczyt danych).Wykorzystywania wyników IsStoring jako przewodnik, można albo wstawić nazwę obiektu dane w CArchive obiekt z operatora wstawiania (<<) lub wyodrębnienia danych z operatorem ekstrakcji (>>).

Należy wziąć pod uwagę, jest pochodną klasy CObject i ma dwie nowe zmienne składowe, typów CString i program WORD.Poniższy fragment deklaracji klasy zawiera nowy członek zmiennych i deklaracji zastąpiona Serialize funkcji składowej:

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ć element członkowski funkcja seryjne

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

  2. Umożliwia wstawienie lub wyodrębnić zmienne składowe specyficzne dla swojej klasy.

    Operatorzy wstawiania i ekstrakcji w interakcje z klasy archiwum do odczytu i zapisu danych.Poniższy przykład pokazuje, jak wdrożyć Serialize dla 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 odczytywania i zapisywania dużych ilości danych bez typu.

Korzystanie z makra DECLARE_SERIAL

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

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

Definiowanie konstruktora bez argumentów

MFC wymaga konstruktora domyślnego, gdy ponownie program tworzy obiekty jak są one rozszeregować (załadowany z dysku).Proces deserializacji wypełni wszystkie zmienne składowe z wartości wymagane do ponownego utworzenia tego obiektu.

Ten konstruktor może być deklarowana na publiczne, chronionych lub prywatne.Jeśli je chronionych lub prywatne, możesz pomóc, upewnij się, że to posłużą jedynie przez funkcje serializacji.Konstruktor musi umieścić obiekt w Państwie, dzięki któremu mogą go usunąć, jeśli to konieczne.

[!UWAGA]

Jeśli zapomnisz do definiowania konstruktora bez argumentów w klasie, która korzysta z DECLARE_SERIAL i IMPLEMENT_SERIAL makra, wyświetlone zostanie 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 kiedy można czerpać serializować klasy z CObject.Używanie tego makra w pliku implementacji (.CPP) dla swojej klasy.Pierwsze dwa argumenty do makra są nazwę klasy i nazwa jego natychmiastowego klasy podstawowej.

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

Kod serializacji MFC sprawdza numer schematu podczas odczytywania obiektów do pamięci.Jeśli numer schematu obiektu na dysku odpowiada numerowi schematu klasy w pamięci, biblioteka będzie rzucić CArchiveException, uniemożliwiając czytanie Nieprawidłowa wersja obiektu programu.

Jeśli chcesz Twój Serialize funkcji członka, aby można było odczytać wiele wersji — to znaczy pliki napisane z różnymi wersjami aplikacji — można użyć wartości VERSIONABLE_SCHEMA jako argument IMPLEMENT_SERIAL makro.Aby uzyskać informacje dotyczące użycia i zobaczyć przykład, zobacz GetObjectSchema funkcji składowej klasy CArchive.

Poniższy przykład pokazuje, jak używać IMPLEMENT_SERIAL dla klasy, CPerson, który jest pochodną CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Po uzyskaniu klasy serializować może serializować obiektów klasy, omówionego w artykule serializacji: Serializowanie obiektu.

Zobacz też

Koncepcje

Serializacja w MFC