Generowanie klasy z XML i Deserializacja .Net (C#)

By | 21 kwietnia 2014

Deserializacje danych z plików XML można przeprowadzić na wiele różnych sposobów. Większość z nich wymaga albo dodatkowych bibliotek, albo zaawansowanej wiedzy na temat XML. Sposób który tutaj opiszę będzie przede wszystkim bardzo prosty, ale oprócz tego nie będzie wymagał nic więcej poza tym co znajdziemy domyślnie w VisualStudio.

Czym jest serializacja, deserializacja i do czego się przydają?

Serializacja jest to przekształcenie obiektu na postać strumienia danych, tak aby w późniejszym czasie móc ten strumień przetworzyć i odtworzyć stan obiektu. Serializacji używa się wszędzie tam, gdzie trzeba zapisać dane programu w takiej formie, żeby później łatwo było je przywrócić. Procesem odwrotnym do serializacji jest deserializacja. Proces ten polega na odczytaniu wcześniej zapisanego strumienia danych i odtworzeniu na tej podstawie obiektu klasy wraz z jego stanem bezpośrednio sprzed serializacji.

Wykorzystanie deserializacji w praktyce

Jeżeli strona internetowa posiada interfejs API, to w większości przypadków będzie udostępniać dane w formacie XML lub JSON. W przypadku gdy chcemy stworzyć aplikacje pogodową, która będzie pobierała informacje ze strony (np. OpenWeatherMap) i wyświetlała na ekranie telefonu w przyjazny sposób, użyjemy właśnie serializacji.

1. Generowanie klasy z pliku XML

Pierwszym etapem deserializacji jest utworzenie klas na podstawie pliku XML. W Visual Studio 2013 jest funkcja „Paste XML As Classes”. Należy wcześniej skopiować kod pliku XML, który zamierzamy deserializować i w oknie VS, wybrać opcję „Paste XML As Classes”.

Generowanie klasy z XML

Generowanie klasy z XML

Uzyskamy mniej więcej taki kod:

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class Produkty
    {
        public Produkty()
        {
            produktField = new List<ProduktyProdukt>();
        }

        private List<ProduktyProdukt> produktField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Produkt")]
        public List<ProduktyProdukt> Produkt
        {
            get
            {
                return this.produktField;
            }
            set
            {
                this.produktField = value;
            }
        }
    }

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class ProduktyProdukt
    {

        private string nazwaField;

        private string opisField;

        private string kategoriaField;

        private double cenaField;

        /// <remarks/>
        public string Nazwa
        {
            get
            {
                return this.nazwaField;
            }
            set
            {
                this.nazwaField = value;
            }
        }

        /// <remarks/>
        public string Opis
        {
            get
            {
                return this.opisField;
            }
            set
            {
                this.opisField = value;
            }
        }

        /// <remarks/>
        public string Kategoria
        {
            get
            {
                return this.kategoriaField;
            }
            set
            {
                this.kategoriaField = value;
            }
        }

        /// <remarks/>
        public double Cena
        {
            get
            {
                return this.cenaField;
            }
            set
            {
                this.cenaField = value;
            }
        }
    }

2. Deserializacja XML – Wczytywanie strumienia z pliku XML

Teraz pozostało nam już tylko wczytać plik XML oraz deserializować go do postaci obiektu klasy, którą przed chwilą wygenerowaliśmy.

            FileStream fs = File.OpenRead("przykladowy.xml"); // utworzenie strumienia i wczytanie pliku xml
            Produkty obiekt = (Produkty)new XmlSerializer(typeof(Produkty)).Deserialize(fs); // deserializacja do obiektu klasy Produkty

            foreach (var element in obiekt.Produkt)
            {
                Console.WriteLine(element.Nazwa);
                Console.WriteLine(element.Opis);
                Console.WriteLine(element.Kategoria);
                Console.WriteLine(element.Cena);
                Console.WriteLine("---");
            }
            Console.ReadKey();

3 thoughts on “Generowanie klasy z XML i Deserializacja .Net (C#)

  1. Pingback: Serializacja i deserializacja binarna C# - Poradnik informatyka

Dodaj komentarz

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