C# ile XML Serialization Ve Deserialization İşlemleri

  • 06.05.2016
  • M.Tayyip Yetiş
  • .Net Framework

http://www.opencart.gen.tr/wp-content/uploads/2015/12/xml.pngMerhaba arkadaşlar bu makalede veri işlemlerimizde sıkça kullanabileceğimiz bir bilgiden bahsedeceğim. Her zaman söylediğim gibi XML benim için en kolay ve verimli veri saklama ve işleme teknolojisi bu teknoloji ile veri katmanı ile iş katmanını en verimli şekilde birleştirebiliyoruz bu makalede de bu birleştirme işlemlerinden olan Serialization ve Deserialization yapısı ile ilgili bir örnek paylaşacağım. 

Deserialization İşlemi

Class yapısına dönüştüreceğimiz örnek XML dökümanımız aşağıdaki gibidir.

XML Dosyası

<?xml version="1.0" encoding="utf-8"?>
<Depo>
  <Urunler>
    <Urun>
      <StokNumarası>1020</StokNumarası>
      <Marka>Nissan</Marka>
      <Model>Sentra</Model>
    </Urun>
    <Urun>
      <StokNumarası>1010</StokNumarası>
      <Marka>Toyota</Marka>
      <Model>Corolla</Model>
    </Urun>
    <Urun>
      <StokNumarası>1111</StokNumarası>
      <Marka>Honda</Marka>
      <Model>Accord</Model>
    </Urun>
  </Urunler>
</Depo>

C# Classı

XML dökümanımızın kod tarafındaki temsil edildiği diğer bir değişle "üzerine giydirildiği" class yapımız da aşağıdaki gibidir. normal class'tan farkı property'lerin üzerinde XmlElement, Serializable, XmlArray gibi etiketler bulunmasıdır bunlar tanımlanan değişkenin XML dökümanında nasıl bir karşığı olduğunu bildirmemizi sağlar.

using System.Xml.Serialization;
namespace WebApplication
{
    [Serializable()]
    public class Urun
    {
        [System.Xml.Serialization.XmlElement()]
        public string StokNumarası { get; set; }

        [System.Xml.Serialization.XmlElement()]
        public string Marka { get; set; }

        [System.Xml.Serialization.XmlElement()]
        public string Model { get; set; }
    }


    [Serializable()]
    public class Depo
    {
        [XmlArray("Urunler")]
        [XmlArrayItem("Urun", typeof(Urun))]
        public Urun[] Urun { get; set; }
    }
}

Main Class

XML dökümanımızı ve sınıfımızı tanımladıktan sonra sıra bunları kullanmaya geldi. Bu işlem için XmlSerializer sınıfını kullanacağız bu sınıf Stream türünden bir parametre alıyor bu parametreye xml dökümanımızı aktarıyoruz ardından Deserialize metoduyla verileri sınıfımıza yüklüyoruz. kontrol ettiğinizde XML dökümanındaki verilerin sınıfınızdaki değişkenlere hiyerarşik olarak aktarıldığını göreceksiniz.

Depo urunler= null;
string path = Server.MapPath("urunler.xml");

XmlSerializer serializer = new XmlSerializer(typeof(Depo));

StreamReader reader = new StreamReader(path);
urunler = (Depo)serializer.Deserialize(reader);
reader.Close();

Serialization

Hazırlanıyor...

XML yapısını Dynamic Türünden Bir Nesneye Dönüştürmek

Orjinal makaleye Buradan ulaşabilirsiniz. Aşağıda XmlToDynamic class ı yer almaktadır. Parse metodu, parametre olarak verilen Dynamic nesneye XElement türündeki XML Node nesnesini giydirir

public class XmlToDynamic {
 public static void Parse(dynamic parent, XElement node) {
  if (node.HasElements) {
   if (node.Elements(node.Elements().First().Name.LocalName).Count() > 1) {
    //list
    var item = new ExpandoObject();
    var list = new List < dynamic > ();
    foreach(var element in node.Elements()) {
     Parse(list, element);
    }

    AddProperty(item, node.Elements().First().Name.LocalName, list);
    AddProperty(parent, node.Name.ToString(), item);
   } else {
    var item = new ExpandoObject();

    foreach(var attribute in node.Attributes()) {
     AddProperty(item, attribute.Name.ToString(), attribute.Value.Trim());
    }

    //element
    foreach(var element in node.Elements()) {
     Parse(item, element);
    }

    AddProperty(parent, node.Name.ToString(), item);
   }
  } else {
   AddProperty(parent, node.Name.ToString(), node.Value.Trim());
  }
 }

 private static void AddProperty(dynamic parent, string name, object value) {
  if (parent is List < dynamic > ) {
   (parent as List < dynamic > ).Add(value);
  } else {
   (parent as IDictionary < String, object > )[name] = value;
  }
 }
}

Kullanımı ise şöyledir.

using System.Xml.Linq;
using System.Dynamic;

XDocument doc = XDocument.Parse(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<root>
  <settings>
    <ayar>basarili</ayar>
  </settings>
  <contacts>
    <contact id=""1"">
      <firstName>Michael</firstName>
      <lastName>Jordan</lastName>
      <age>40</age>
      <dob>1965</dob>
      <salary>100.35</salary>
    </contact>
    <contact id=""2"">
      <firstName>Scottie</firstName>
      <lastName>Pippen</lastName>
      <age>38</age>
      <dob>1967</dob>
      <salary>55.28</salary>
    </contact>
  </contacts>
</root>");

dynamic obj = new ExpandoObject();
XmlToDynamic.Parse(obj, doc.Elements().First());

var contacts = obj.root.contacts;

 

Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı

Yorum Yap