Krzysztof Mossakowski
Materiały dla studentów
 

Serializacja
(klasy CObject, CArchive)

MFC
Spis treści

Serializacja
klasy CObject, CArchive
Informacje ogólne
Stosowanie serializacji
Klasa CArchive
Klasa CObject
Hierarchia klas

  •  Informacje ogólne

    • Serializacja to proces zapisania/odczytania obiektu do/z miejsca składowania informacji

      • miejscem składowania informacji jest obiekt klasy CArchive, zawsze powiązany z plikiem, zwykle dyskowym

    • Główne cechy serializacji:

      • obiekt sam siebie zapisuje i odczytuje, zwykle jest to zapis i odczyt swoich składowych

      • stosowany jest binarny odczyt i zapis

      • mechanizm serializacji jest zaimplementowany w klasie CObject, wszystkie obiekty z niej dziedziczące dziedziczą także możliwość stosowania serializacji
        - większość klas MFC dziedziczy z CObject

[początek strony]

  •  Stosowanie serializacji

    • Schemat tworzenia klasy, której obiekty mają mieć możliwość serializacji:

      • klasa musi być potomkiem CObject (niekoniecznie bezpośrednim)

      • w deklaracji klasy musi znaleźć się makro DECLARE_SERIAL z parametrem określającym nazwę tej klasy

      • w pliku z implementacją klasy musi być makro IMPLEMENT_SERIAL

      • musi być bezparametrowy konstruktor
        - może być publiczny, chroniony lub prywatny (chroniony lub prywatny zapewni jego wykorzystanie tylko w serializacji)
        - wykorzystywany jest podczas wczytywania obiektu, wtedy obiekt jest powtórnie tworzony

      • nadpisać metodę CObject::Serialize
        - pierwszą czynnością powinno być wywołanie tej metody z klasy rodzica
        - po sprawdzeniu funkcją CArchive::IsStoring kierunku przesyłania danych (odczyt z archiwum albo zapis do archiwum) oprogramować odczyt i zapis

[początek strony]

  •  Klasa CArchive

    • Obiekty klasy CArchive mogą być archiwami wykorzystywanymi w mechaniźmie serializacji

    • Schemat tworzenie archiwum przy użyciu architektury dokument/widok i standardowej obsługi polecenia "Save As"

      • automatycznie zostanie pobrana od użytkownika nazwa docelowego pliku

      • zostanie utworzony i otwarty obiekt klasy CFile odpowiadający temu plikowi

      • zostanie utworzony obiekt klasy CArchive wskazujący na ten obiekt CFile

      • tryb archiwum zostanie ustawiony na zapis

      • dla aktywnego dokumentu zostanie wywołana metoda CDocument::Serialize
        - jest to wirtualna funkcja, w której powinien się znaleźć kod odczytu i zapisu danych dokumentu do archiwum

    • Schemat tworzenia archiwum w pozostałych przypadkach:

      • utworzyć obiekt klasy CFile lub dziedziczącej

      • przekazać ten obiekt do konstruktora obiektu klasy CArchive

    • Dwie metody odczytu i zapisu do archiwum

      • operatory << (zapis) i >> (odczyt)
        - operator >> tworzy obiekt na podstawie informacji zawartej w CRuntimeClass zapisanej w archiwum

      • metoda CObject::Serialize
        - powinna być używana gdy znany jest dokładny typ obieku
        - oraz pamięć dla obiektu jest przydzielona

      • nie można mieszać tych dwóch metod, obiekt zapisany przy pomocy >> powinien zostać wczytany korzystając z << i tak samo z CObject::Serialize

[początek strony]

  •  Klasa CObject

    • Klasa CObject jest bazową klasą dla obiektów, które są serializowalne

      • każdy obiekt, który ma być serializowalny, musi pochodzić z klasy pochodnej z CObject

    • Zwiększanie funkcjonalności klas dziedziczących z CObject:

      • możliwość uzyskania informacji o typie obiektu podczas wykonywania kodu (run-time class information)
        - konieczne jest dodanie makra DECLARE_DYNAMIC do definicji klasy i IMPLEMENT_DYNAMIC do pliku zawierającego implementację
        - sprawdzenie typu obiektu jest możliwe przy pomocy metody CObject::IsKindOf

      • dynamiczne tworzenie, czyli tworzenie obiektu określonej klasy podczas wykonywnaia kodu
        - makro DECLARE_DYNCREATE w definicji, IMPLEMENT_DYNCREATE w pliku z implementacją
        - mechanizm ten jest wykorzystywany przede wszystkim w serializacji
        - musi być zdefiniowany bezparametrowy konstruktor
        - zastowanie dynamicznego tworzenia daje możliwość uzykania informacji o typie obiektu podczas wykonywania kodu

      • serializacja
        - makro DECLARE_SERIAL w definicji, IMPLEMENT_SERIAL w pliku z implementacją
        - musi być zdefiniowany bezparametrowy konstruktor
        - zastosowanie serializacji daje możliwość dynamicznego tworzenia

    • Dodatkowe możliwości klasy CObject podczas debugowania:

      • wirtualna metoda CObject::AssertValid wykorzystywana do sprawdzenia poprawności stanu wewnętrznego obiektu
        - przed przeprowadzeniem operacji na obiekcie można najpierw sprawdzić jego stan, czyli wszystkie jego dane są poprawne
        - standardowo ta metoda jest pusta

      • wirtualna metoda CObject::Dump wykorzystywana do wypisania danych obiektu na wyjściu diagnostycznym

[początek strony]

[początek strony]