Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C#’ta XmlSerializer Sınıfı İle Serialization ve Deserialization

Merhaba,

Bu yazımızda C#’ta XmlSerializer sınıfını ile Serialization(serileştirme) ve Deserialization(seriden paralele çevirme) işlemlerini inceleyeceğiz. Tabi öncelikle bu terimlerin ne olduğunu, ne yapınca bu terminolojiyle nitelendirildiğini açmak lazım.

Program ortamında veri yapısı olarak nitelendirdiğimiz herhangi bir sınıfı – modeli – entityi vs. içeriğiyle birlikte xml veri yapısı haline getirme işlemi Serialization olarak nitelendirilmekteyken, tam tersi şeklinde bir xml yapısını herhangi bir veri yapısına dönüştürmeye yani ilgili xml içerisindeki verileri kalıba karşılık gelecek bir modele aktarmayada Deserialization demekteyiz.

Şimdi aşağıdaki sınıfımızı ele alalım.

    class Ornek
    {
        public int x { get; set; }
        public int y { get; set; }
    }

Bu sınıfı XmlSerializer sınıfı ile xml formatına modellediğimiz zaman sınıf ismimiz root eleman olacak, propertylerimiz ise node elemanlar olacaktır.

Gelin bu işlemi nasıl yapacağız görelim.

    public class Ornek
    {
        public int x { get; set; }
        public int y { get; set; }
        public void XMLKaydet()
        {
            var xml = new XmlSerializer(typeof(Ornek));
            //Ornek tipinde bir serileştirme yapacak nesnemizi oluşturuyorum.
            using (StreamWriter sw = new StreamWriter(@"D:\OrnekXML.xml"))
            {
                xml.Serialize(sw, this);
                //Şuanki mevcut nesneyi(this) sw'nin tuttuğu dizine xml olarak serileştiriyoruz.
            }
        }
    }

Şimdi Ornek sınıfını serileştirelim.

    class Program
    {
        static void Main(string[] args)
        {
            Ornek ornek = new Ornek();
            ornek.x = 3;
            ornek.y = 5;
            ornek.XMLKaydet();
        }
    }

Evet bu işlemden sonra ilgili dizinde dosyamızın oluşturulduğunu görüyor ve dosyayı açıyoruz. Aşağıdaki ekran görüntüsündeki gibi bir sonuçla karşılaşacağız.
C#'ta XmlSerializer Sınıfı İle Serialization ve Deserialization
Gördüğünüz gibi sınıf elemanları bu şekilde serilize edilmektedir.

Eğer nodelar içerisinde child dediğimiz elemanlarıda oluşturmak istiyorsanız eğer koleksiyon tipinden propertyler işinizi görecektir.

    public class Ornek
    {
        public int x { get; set; }
        public int y { get; set; }
        public List<string> z { get; set; }
        public void XMLKaydet()
        {
            var xml = new XmlSerializer(typeof(Ornek));
            //Ornek tipinde bir serileştirme yapacak nesnemizi oluşturuyorum.
            using (StreamWriter sw = new StreamWriter(@"D:\OrnekXML.xml"))
            {
                xml.Serialize(sw, this);
                //Şuanki mevcut nesneyi(this) sw'nin tuttuğu dizine xml olarak serileştiriyoruz.
            }
        }
    }

Dikkat ederseniz yukarıdaki prototipimize List<string> tipinde z referans adında bir property ekledim.

    class Program
    {
        static void Main(string[] args)
        {
            Ornek ornek = new Ornek();
            ornek.x = 3;
            ornek.y = 5;
            ornek.z = new List<string> { "Ornek 1", "Ornek 2", "Ornek 3", "Ornek 4", "Ornek 5" };
            ornek.XMLKaydet();
        }
    }

Bu şekilde projeyi derleyip çalıştırdığınızda aşağıdaki gibi bir sonuçla karşılaşacaksınız.
C#'ta XmlSerializer Sınıfı İle Serialization ve Deserialization

Eğer ki, childlerin isimlerini belirlemek istiyorsanız tasarladığınız sınıfa özel bir koleksiyonda çalışabilirsiniz.

    public class Ornek2
    {
        public string a { get; set; }
        public string b { get; set; }
    }
    public class Ornek
    {
        public int x { get; set; }
        public int y { get; set; }
        public List<Ornek2> z { get; set; }
        public void XMLKaydet()
        {
            var xml = new XmlSerializer(typeof(Ornek));
            //Ornek tipinde bir serileştirme yapacak nesnemizi oluşturuyorum.
            using (StreamWriter sw = new StreamWriter(@"D:\OrnekXML.xml"))
            {
                xml.Serialize(sw, this);
                //Şuanki mevcut nesneyi(this) sw'nin tuttuğu dizine xml olarak serileştiriyoruz.
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Ornek ornek = new Ornek();
            ornek.x = 3;
            ornek.y = 5;
            ornek.z = new List<Ornek2> {
                new Ornek2 { a = "1a", b = "1b" },
                new Ornek2 { a = "2a", b = "2b" },
                new Ornek2 { a = "3a", b = "3b" },
                new Ornek2 { a = "4a", b = "4b" },
                new Ornek2 { a = "5a", b = "5b" }
            };
            ornek.XMLKaydet();
        }
    }

İşte bu şekilde çalıştığımız zamanda elde ettiğimiz çıktı aşağıdaki gibi olacaktır.
C#'ta XmlSerializer Sınıfı İle Serialization ve Deserialization

Şuana kadar Serialization işlemini gerçekleştirdik. Şimdide elimizdeki xml dosyasını Deserialization’a işlemine tabi tutarak mevcut veri yapımızda elde edelim.

Ornek sınıfı içerisinde aşağıdaki metodu oluşturalım.

        public void XMLYukle()
        {
            var xml = new XmlSerializer(typeof(Ornek));
            //Ornek tipinde bir deserialization yapacak nesnemizi oluşturuyorum.
            using (StreamReader sr = new StreamReader(@"D:\OrnekXML.xml"))
            {
                Ornek o = (Ornek)xml.Deserialize(sr);
                //Verilen dizindeki xml deserialization yapılarak nihayetinde Ornek tipinde elde edilecektir.
                //object olarak gelen nesneyi biz Ornek tipine cast ediyoruz.
                this.x = o.x;
                this.y = o.y;
                this.z = o.z;
                //Gelen nesnenin verilerini şuandaki mevcut nesnenin veri alanlarına atamaktayız.
            }
        }

Bu işlemden sonra Ornek sınıfımızı önce serileştirelim ardından tekrardan paralelleştirelim.

    class Program
    {
        static void Main(string[] args)
        {
            #region Serialize
            Ornek ornek = new Ornek();
            ornek.x = 3;
            ornek.y = 5;
            ornek.z = new List<Ornek2> {
                new Ornek2 { a = "1a", b = "1b" },
                new Ornek2 { a = "2a", b = "2b" },
                new Ornek2 { a = "3a", b = "3b" },
                new Ornek2 { a = "4a", b = "4b" },
                new Ornek2 { a = "5a", b = "5b" }
            };
            ornek.XMLKaydet();
            #endregion

            #region Deserialize
            Ornek ornek2 = new Ornek();
            ornek2.XMLYukle();
            Console.WriteLine(ornek2.x + " " + ornek2.y);
            ornek.z.ForEach(x => Console.WriteLine("Liste : " + x.a + " " + x.b));
            #endregion
            Console.Read();
        }
    }

C#'ta XmlSerializer Sınıfı İle Serialization ve Deserialization
Gördüğünüz gibi ornek2 referansı üzerinden xml dosyamızdaki verilerin çıktısını alabilmekteyiz.

Bir sonraki yazımızda XmlSerializer sınıfı ile Generic bir şekilde Serialization ve Deserialization işlemlerini gerçekleştireceğimiz tasarı üzerine konuşacağız.

Şimdilik görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 02 Ağustos 2016

    […] önceki C#’ta XmlSerializer Sınıfı İle Serialization ve Deserialization başlıklı yazımda XmlSerializer sınıfı ile serileştirme ve paralelleştirme işlemlerini […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir