Serializacja klasy do XML

Pisząc program, choćby prostą aplikację „ToDo” chcielibyśmy zachować stan naszej aplikacji tak by po jej ponownym uruchomieniu odczytane zostało to, co wprowadziliśmy podczas poprzedniego uruchomienia. Możemy oczywiście użyć zapisów do bazy danych (w tym do SQLite, gdzie może to być baza plikowa), zapisów do plików z wykorzystaniem własnych formatów. Możemy także użyć zapisu do plików w formacie XML, o których pisałem już kiedyś. Zapisz do plików XML ma sporo zalet, choćby to, że są to pliki tekstowe i łatwe do odczytu, modyfikacji i przenoszenia pomiędzy systemami.

Format pliku XML już przytaczałem (na dole pojawi się link do artykułu na temat XML-a to kto zainteresowany może spojrzeć). Dla przypomnienia prosty plik XML:

<?xml version="1.0"?>
<Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Name>Monika</Name>
  <Surname>Malec</Surname>
  <DateOfBirth>1952-04-02T00:00:00</DateOfBirth>
</Person>

Powyższy plik zawiera zapis stanu obiektu klasy „Person”, który został zdefiniowany w programie w następujący sposób:

    public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public DateTime DateOfBirth { get; set; }

        public Person()
        {

        }

        public Person(string name, string surname, DateTime birthdate)
        {
            this.Name = name;
            this.Surname = surname;
            this.DateOfBirth = birthdate;
        }
    }

Załóżmy, że w programie tworzymy obiekt klasy Person i chcemy zapisać (serializować) jego stan. W tym celu tworzymy sobie metodę, która będzie serializować nasz obiekt. Kod metody poniżej:

        public static void SerializePerson(Person per)
        {
            string filename = "person.xml";

            var serializer = new XmlSerializer(typeof(Person));

            using (var stream = File.Open(filename, FileMode.Create))
            {
                serializer.Serialize(stream, per);
            }
        }

Zobaczmy teraz jak będzie wyglądać to w programie. W tym celu dodajemy do programu odwołanie do przestrzeni nazw:

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

Potem tworzymy obiekt klasy Person a następnie wywołamy metodę serializującą ten obiekt tak jak w poniższym kodzie:

            Person osoba1 = (new Person("Monika", "Malec", DateTime.Parse("1952-04-02"));

            SerializePerson(osoba1);

No a na koniec, jeśli wszystko było w porządku na dysku zostaje zapisany plik person.xml o zawartości takiej jak podałem na początku. Jeśli plik znajdował się na dysku to zostanie nadpisany nową zawartością, trzeba mieć to na uwadze.

No ale co jeśli mamy listę obiektów klasy Person i chcemy ją serializować do XML? No to serializujemy!
W tym celu tworzymy metodę serializującą naszą listę obiktów klasy Person (załóżmy, że lista ta będzie nazywać się „persons”). Metoda będziemieć kod taki jak poniżej:

            string filename = "persons.xml";

            var serializer = new XmlSerializer(typeof(List<Person>));

            using (var stream = File.Open(filename, FileMode.Create))
            {
                serializer.Serialize(stream, per);
            }

W kodzie naszego programu na początku utworzymy listę obiektów klasy Person a następnie poddamy ją serializacji.

            List<Person> persons = new List<Person>();

            persons.Add(new Person("Jan", "Nowak", DateTime.Parse("1965-12-11")));
            persons.Add(new Person("Bożena", "Kowalska", DateTime.Parse("1945-03-25")));
            persons.Add(new Person("Jan", "Nowak", DateTime.Parse("2012-04-02")));
            persons.Add(new Person("Grażyna", "Abacka", DateTime.Parse("1982-10-10")));
            persons.Add(new Person("Janusz", "Sofacki", DateTime.Parse("1974-11-02")));

            SerializePersons(persons);

Po tym wszystkim mamy szansę na otrzymanie na dysku pliku „persons.xml”:

<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Person>
    <Name>Jan</Name>
    <Surname>Nowak</Surname>
    <DateOfBirth>1965-12-11T00:00:00</DateOfBirth>
  </Person>
  <Person>
    <Name>Bożena</Name>
    <Surname>Kowalska</Surname>
    <DateOfBirth>1945-03-25T00:00:00</DateOfBirth>
  </Person>
  <Person>
    <Name>Jan</Name>
    <Surname>Nowak</Surname>
    <DateOfBirth>2012-04-02T00:00:00</DateOfBirth>
  </Person>
  <Person>
    <Name>Grażyna</Name>
    <Surname>Abacka</Surname>
    <DateOfBirth>1982-10-10T00:00:00</DateOfBirth>
  </Person>
  <Person>
    <Name>Janusz</Name>
    <Surname>Sofacki</Surname>
    <DateOfBirth>1974-11-02T00:00:00</DateOfBirth>
  </Person>
</ArrayOfPerson>

Mając dane zserializowane do pliku XML z pewnością chcielibyśmy te dane odczytać przy starcie programu no ale to będzie tematem kolejnego wpisu „Deserializacja klasy z XML”.

Autor: gervee

Pełnoetatowy ojciec małej gromadki, programista(?), "amator" fotograf, "dłubacz" lubiący DIY, miłośnik chmielonego napitku. "Żartowniś" bez poczucia humoru ;).

Dodaj komentarz