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:

public class Osoba
{
    public string Imie { get; set; }
    public string Nazwisko { get; set; }
}

Stwórzmy nowy obiekt:

Osoba ja = new Osoba();
ja.Imie = "Krystian";
ja.Nazwisko = "Brożek";

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

using System.Xml.Serialization;
using System.IO;

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:

XmlSerializer xs = new XmlSerializer(typeof(Osoba));
using(Stream s = File.Create("osoba.xml"))
    xs.Serialize(s, p);

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:

Osoba ja2;
XmlSerializer xs = new XmlSerializer(typeof(Osoba));
Using(Stream s = File.OpenRead(„osoba.xml”))
    ja2 = (Osoba)xs.Deserialize(s);

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.

Dołącz do newslettera już dziś!
Zero spamu - tylko wartościowe treści!
Musisz już lecieć?
Zostaw swój adres e-mail i dołącz do BEZPŁATNYCH WEBINARÓW dotyczących SQLa!
  • „Jak uczyć się SQLa?” – 4 października
  • „SQL dla testerów” – 12 października