Kontynuując serię o XML, opowiem serializacji. Wiemy już całkiem sporo o dokumentach XML, więc opiszę jak je tworzyć z obiektów w programie i odtwarzać z nich obiekty.

Serializacja i deserializacja, bo o nich mowa, są z reguły używane do:

  • przesyłania obiektów przez sieć lub poza aplikację,
  • przechowywania obiektów w pliku lub bazie danych.

Serializacja zatem służy do pobierania obiektu i umieszczania go w strumieniu bajtów lub dokumencie XML. Natomiast deserializacja, to proces odwrotny, czyli zamieniamy strumień bajtów lub dokument XML na obiekty.

Istnieją cztery mechanizmy serializacji w .NET:

  • serializacja kontraktu danych,
  • serializacja binarna,
  • serializacja XML (XmlSerializer),
  • interfejs IXmlSerializable.

Zajmiemy się tylko jedną opcją. Znów wybieramy bramkę numer 3. XmlSerializer służy do generowania danych w formacie XML. W przeciwieństwie do pozostałych mechanizmów nie może przywracać odwołań do obiektów, za to jest prostoty i elastyczny.

Koniec nudnej teorii, przejdźmy do mięcha!

Załóżmy, że mamy prostą klasę Osoba:

Stwórzmy nowy obiekt:

Zanim zapiszemy nasz obiekt do dokumentu XML, musimy dodać referencje do dwóch bibliotek:

Pierwsza przestrzeń nazw zawiera w sobie m.in. XmlSerializer, którego użyjemy do serializacji obiektu do dokumentu XML. W drugiej znajdziemy klasy, które odpowiadają za wejście i wyjście. Wśród nich znajdziemy dwie interesujące nas klasy, a mianowicie Stream, którą użyjemy do zapisu pliku na dysku i File, dzięki której ten plik utworzymy.

Teraz za pomocą serializacji zapiszemy ten obiekt na dysku jako dokument XML:

Po wykonaniu powyższego kodu zostanie utworzony plik osoba.xml na dysku i zapisany w nim nasz obiekt.

Pojawiła się tu metoda typeof. Jeśli potrzebujemy poznać typ danego obiektu, możemy skorzystać z tej metody i zwróci nam ona jako wynik właśnie obiekt typu Type, którego wartością będzie właśnie typ naszego obiektu. Tu nam jest to potrzebne, aby XmlSerializer mógł stworzyć strukturę naszego dokumentu i wiedział jakie dane wykorzystać do przetworzenia.

Teraz wystarczy uruchomić nasz program, wykonać powyższy kod, a obiekt zostanie zserializowany i zapisany do pliku.

Operacja w drugą stronę jest tak samo prosta:

Metoda deserialize zwraca nam odczytany obiekt ze strumienia danych i zwraca wypełniony danymi obiekt. Trzeba jedynie pamiętać unboxingu, czyli należy otrzymany wynik rzutować na naszą klasę, ponieważ jest on ogólnego typu object.

W taki oto prosty sposób możemy zamieniać obiekty w programie na dokumenty XML i odwrotnie. W kolejnych wpisach przedstawię bardziej zaawansowane mechanizmy związane z dokumentami XML.