Utisci korisnika

"Želim da kazem da iako sam tek na pola, da sam oduševljena ovim načinom na koji stvari funkcionisu!" Stanislava Kraguljac, Beograd

Želeo bih da Vam se zahvalim na Vašoj brzoj pošiljci, sertifikatu i novom kursu, koji sam juče preuzeo putem Post-expresa. Još jedanput Vam se zahvaljujem na Vašoj profesionalnosti.…


Kompletna lista utisaka

Testiranje online

Arhitektura računara

Za one koji žele da znaju više.

Windows OS

Ovo bi svakako trebalo da probate.

Odnosi s javnošću

Koliko znate PR?

Pogledajte još neke od testova

Newsletter

Ukoliko želite da Vas redovno obaveštavamo o novostima sa Link eLearning sajta prijavite se na našu newsletter listu.

Ime:

Prezime:

Email:


Anketa

Arhiva anketa

BAZA ZNANJA


Kurs: XML tehnologije i veb servisi

Modul: XML tehnologije

Autor: Vladimir Marić

Naziv jedinice: XML serijalizacija (System.Xml.Serialization)


Materijali vezani uz ovu lekciju:

- Test xml serijalizacija (system.xml.serialization)
- XML serijalizacija (System.Xml.Serialization) (PDF dokument)



Pored tehnologija obrađenih u prethodnim lekcijama, C# nudi i tehnologiju za automatsku serijalizaciju i deserijalizaciju XML-a u objekte i iz njih. Da bismo koristili ovu opciju, moramo implementirati prostor imena System.Xml.Serialization.

 

Serijalizacija

Da bi klasa čije instance želimo da serijalizujemo bila serijalizabilna, mora biti javna, kao i atributi koje želimo da serijalizujemo. Takođe, ne sme imati parametrizovani konstruktor.

public class Izdanje
    {
        public int id;
        public string isbn;
        public string naslov;
        public string autor;
    }

 

Da bismo kreirali XML dokument od određene klase (Instance), koristimo XmlSerializer klasu.

Ali, prvo ćemo napraviti instancu klase "izdanje" i napuniti je podacima:

Izdanje izdanje = new Izdanje();
izdanje.id = 1;
izdanje.isbn = "1111";
izdanje.autor = "Viljem Sekspir";
izdanje.naslov = "Mnogo buke ni oko cega";

 

Zatim kreiramo objekat klase XmlSerializer.

XmlSerializer sr = new XmlSerializer(typeof(Izdanje));


XmlSerializer zahteva tip podatka kao parametar, pa prosleđujemo tip koji želimo da serijalizujemo.

Konačno, pozivamo metod XmlSerializer klase, Serialize, koji kao parametre prihvata serializacioni strim i objekat koji serijalizujemo:

sr.Serialize(Console.Out,izdanje);

 

Ovaj primer će prikazati serijalizovani XML u konzoli. Mogli smo takođe poslati i u tok fajla:

XmlSerializer sr = new XmlSerializer(typeof(Izdanje));
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\mojXml.xml");
sr.Serialize(sw, izdanje);

 

Dobijamo sledeći XML dokument:

<?xml version="1.0" encoding="utf-8"?>
<Izdanje xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<id>1</id>
  <isbn>1111</isbn>
  <naslov>Mnogo buke ni oko cega</naslov>
  <autor>Viljem Sekspir</autor>
</Izdanje>

 

Ovaj dokument nema zadovoljavajuću strukturu jer su id i isbn predstavljeni kao elementi. Da bismo to korigovali, modifikovaćemo samu klasu, tako što ćemo dodati svojstva XmlAttribute za polja id i isbn (jer su nam oni i potrebni kao atributi)

public class Izdanje
    {
        [XmlAttribute]
        public int id;
        [XmlAttribute]
        public string isbn;
        public string naslov;
        public string autor;
    }

 

Sada ćemo dobiti XML željene strukture.

Da su se u klasi nalazila polja sa nazivima koja ne odgovaraju XML dokumentu, mogli bismo jednostavno parametrizovati atribut prema potrebama dokumenta. Na primer, ako bismo želeli da polje isbn emitujemo u XML dokumentu kao isbnBroj, uradili bismo to na sledeći način:

[XmlAttribute("isbnBroj")]
public string isbn;


Ako hoćemo da neko polje ne bude uvršćeno u XML dokument, koristimo atribut XmlIgnore:

[XmlIgnore]
public string autor;


Kada imamo listu elemenata koju želimo da serijalizujemo u XML (što zapravo i jeste najčešći slučaj), možemo jednostavno serijalizovati celu listu:

  //kreiramo listu izdanja
            List<Izdanje> i = new List<Izdanje>();
  //kreiramo izdanje
            Izdanje izdanje = new Izdanje();
            izdanje.id = 1;
            izdanje.isbn = "1111";
            izdanje.autor = "Viljem Sekspir";
            izdanje.naslov = "Mnogo buke ni oko cega";
  //dpdajemo prvo izdanje u listu
            i.Add(izdanje);
  //kreiramo drugo izdanje
            Izdanje izdanje1 = new Izdanje();
            izdanje1.id = 2;
            izdanje1.isbn = "2222";
            izdanje1.autor = "Milorad Pavic";
            izdanje1.naslov = "Predeo slikan cajem";
  //dodajemo drugo izdanje u listu
            i.Add(izdanje1);

 

Sada možemo serijalizovati na isti način kao i u prethodnim primerima, s tom razlikom što ćemo kao serializacioni tip, umesto klase, proslediti tip liste, a u Serialize metodu smestiti samu listu:

XmlSerializer sr = new XmlSerializer(typeof(List<Izdanje>));
...
sr.Serialize(new System.IO.StreamWriter(@"c:\mojXml.xml"), i);

 

Deserijalizacija

XML deserijalizacija je potpuno isti (samo obrnut) koncept kao i serijalizacija. Potrebne su nam zapravo samo dve linije da ostvarimo deserijalizaciju. Prva linija je potpuno ista kao i u procesu serijalizacije (kreira se XmlSerializer objekat na osnovu tipa lista izdanja), dok druga linija preuzima ovu listu metodom Deserialize. Jedino na šta treba obratiti pažnju jeste to da Deserialize metod vraća objekat pa je potrebno izvršiti raspakivanje (Unboxing) u ciljni tip:

XmlSerializer dsr = new XmlSerializer(typeof(List<Izdanje>));
List<Izdanje> i = (List<Izdanje>)dsr.Deserialize(new System.IO.StreamReader(@"c:\mojXml.xml"));
...
foreach(Izdanje izdanje in i)
   Console.WriteLine(izdanje.naslov);

 

Naravno, prilikom rukovanja primerima, treba obratiti pažnju da tokovi budu adekvatno zatvoreni, na primer:

XmlSerializer sr = new XmlSerializer(typeof(List<Izdanje>));
          List<Izdanje> i;
          using (System.IO.StreamReader str = new System.IO.StreamReader(@"c:\mojXml.xml"))
          {
              i = (List<Izdanje>)sr.Deserialize(str);
          }
          foreach(Izdanje izdanje in i)
              Console.WriteLine(izdanje.naslov);

 

Najvažnije iz lekcije:

  1. XML serijalizacija zahteva System.Xml.Serialization prostor imena da bi radila.
  2. XML serijalizacija podrazumeva korišćenje klase XmlSerializer.
  3. XML serijalizacija se kroz XmlSerializer klasu vrši metodom Serialize.
  4. XML deserijalizacija se kroz XmlSerializer klasu vrši metodom Deserialize.
  5. XmlSerializer zahteva tip serializacionog objekta kao parametar.
  6. Moguće je uticati na serijalizaciju iz klase koja se serijalizuje atributima polja klase ([XmlAttribute], [XmlElement], [XmlIgnore]...).
  7. Serialize i Deserialize metode emituju i preuzimaju dokumente iz toka.

 

Vežba

Problem:

Postoji sledeći XML dokument:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPlane xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Plane company="boing" type="747"  />
  <Plane company="airbus" type="330"  />
  <Plane company="boing" type="737"  />
  <Plane company="mcdonnell douglas" type="dc 9"  />
</ArrayOfPlane>

 

Potrebno je kreirati klasu avion i listu aviona u aplikaciji na osnovu datog dokumenta. Potrebno je izvršiti prolazak kroz listu aviona i emitovati podatke o svakom avionu na izlaz (konzolu).

 

Rešenje:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication3
{
    public class Plane
    {
        [XmlAttribute]
        public string company;
        [XmlAttribute]
        public string type;
    }
    class Program
    {
        static void Main(string[] args)
        {
            XmlSerializer sr = new XmlSerializer(typeof(List<Plane>));
            List<Plane> i;
            using (StreamReader str = new StreamReader("myXmlDoc.xml"))
            {
                i = (List<Plane>)sr.Deserialize(str);
            }
            foreach (Plane plane in i)
                {
                    Console.WriteLine(plane.type);
                }
        }
    }
}


Smatrate da je ova lekcija korisna?  Preporučite je. Broj preporuka:1


Molimo Vas unesite svoje podatke i dobićete pristup besplatnim lekcijama.

Ime: 
Prezime: 
Email: