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.
Fajny pościk. Troszkę rozjaśnił temat.
cieszę się, że mogłem pomóc 🙂
Warto też spojrzeć na obsługę xml przez XMLDocument oraz… co czasem może okazać się pomocne, wykorzystanie bazy danych MS SQL Server do zwracania danych w postaci xml – > przy pomocy zapytań FOR XML.
Pozdrawiam
hej. chyba masz błąd w wywołaniu xs.serialize
argumenty to stream i object. prawdopodobnie wystarczy podmienic p na ja.