Serializacja i deserializacja XML-a

XML – czym jest?

XML, czyli Extensible Markup Language  jest popularnym sposobem zapisu danych w formie tekstowej. Przez drzewiastą strukturę i słowny zapis wartości oraz nazw właściwości jest łatwy do zrozumienia. Przy pracy z XML mamy kilka możliwości. Możemy go deserializować do postaci obiektów oraz serializować obiekty do xml-a. Możemy także załadować strukturę do pamięci i przetwarzać je z wykorzystaniem DOM API lub z wykorzystaniem nowszego LINQ to XML API. Dzisiaj skupię się na serializacji obiektów z wykorzystaniem wcześniej przygotowanych klas.

Przygotowanie klasy do serializacji

Jeśli jesteśmy szczęśliwymi posiadaczami schematu dokumentu w postaci pliku *.XSD  lub w naszym xml-u nie ma wartości opcjonalnych, możemy wykorzystać program XSD.EXE (dziś tylko o nim wspominam,
a w następnym poście powiem o nim nieco więcej). Możemy również sami wygenerować potrzebne nam klasy. Wiedząc jak wygląda schemat
(np. z dokumentacji) jesteśmy w stanie napisać wszystkie niezbędne klasy. Serializacja xml-a w dużej mierze wykorzystuje atrybuty, może pamiętasz jak o nich pisałem https://mateuszstanek.pl/2018/02/03/atrybut-c/. Standardowa biblioteka do obsługi serializacji xml-owej dodaje ich kilka, dzięki czemu będziemy mogli z sukcesem przetwarzać nasze obiekty
i xml-e. Kilka najważniejszych z nich to:

  • xmlRoot – określa właściwości głównego elementu.
  • xmlElement – określa parametry mapowania właściwości na element.
  • xmlAttribute – określa parametry mapowania właściwości na atrybut.
  • xmlIgnore – określa, iż oznaczona właściwość ma zostać pominięta przy serializacji/deserializacji.

Z ich pomocą jesteśmy w stanie obsłużyć większość przypadków użycia.

Dziwne podwojenie DataCount jest moją próbą pokazania jak działa XmlIgnore.

Plik xml wygląda mniej więcej tak :

Serializacja- deserializacja

Skoro mamy już klasę przygotowaną, pora ją zserializować. Do serializacji oprócz naszych danych potrzebujemy XmlSerializera oraz strumienia,
do którego go zapiszemy.

Deserializacja jest równie prosta, wykorzystujemy ten sam serializer, używamy jednak metodę deserialize, która przyjmuje tylko strumień danych wejściowych. Należy pamiętać, iż deserializer zwraca nam obiekt, który należy rzutować na wybrany przez nas typ.

 

Przykład Serializacji na GitHubie https://github.com/Matejkos/BlogProjects/tree/master/OperationsOnXML

To be Continued

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *