25 Aralık 2016 Pazar

C# ile XML Serialization ve Deserialization işlemleri

Merhaba;

Bugünkü işleyeceğimiz konu XML Serialization & Deserialization.
Bu konu aslında Serialization sınıfı kapsamında değerlendirilecek olsaydı o zaman diğer 2 yöntemide göstermek gerekirdi.(Binary ve SOAP)

Bu konuda SOAP veya Binary kavramlarını göstermeyeceğime rağmen SOAP hakkında kısa bir bilgi vermek boynumun borcudur.Neden? Çünkü günümüzde WebServis iletişim ağı mükemmel derecede talep görüyor.Her bir kurum bir diğer firmaya entegre olmak istediğinde WebServis 'leri kullanmak durumunda kalıyor.Peki WebServis nedir ne değildir bu konuyu açıklamaya gerek varmı derseniz.WebServis mimarisini ayrı bir alanda incelemenizde fayda var.Ancak SOAP WebServis mimarisin iletişim kanalıdır diyebiliriz.Yani kafa karıştırmadan açıklamak gerekirse WebServis mimarilerini incelediğinizde SOAP tarzı nesne iletişim protokollerini zaten ilk seferde görmüş olacaksınız.Bu yüzden SOAP (Simple Object Access Protocol - Basit Nesne Erişim Protokolü) dediğimiz arayüz WebServis mimarilerinin farklı bir kanalıdır.

Şimdi asıl konumuza gelecek olursak.Yine WebServis mimarilerinden çok fazla uzaklaşmadan asıl adamın yani XML 'in ne kadar önemli olduğunu konuyu incelediğinizde anlayacaksınız.O yüzden size bugün C# üzerinden
önce XML 'i serileştirip daha sonra XML 'i orjinal haline çevirip okumayı göstereceğim.Normal bir okuma işleminden olan farklarını projemiz bittikten sonra gösteriyor olacağız.ve bu işlemleri yaparken asıl amacımın temelini gösteriyor olacağımı belirtmek isterim.O yüzden gelişmiş yapılardan kaçınıyor işin pratiğini ve mantığını anlatmaya çalışacağım.

Proje:
1 adet Label - Dosya yolu
1 adet TextBox
1 adet RichTextBox
2 adet Button - Serialize & Deserialize
[B]Örnek;[/B]


[B]1. ADIM[/B]
using System.Xml.Serialization;
Personel sınıfını tanımlıyoruz.Sınıfa ait 3 özelliğimiz var adi,soyAdi,unvan.
Değerlerini Form1 'in Load olayında biz belirleyeceğiz.Bu durumda özelliğin boş kalması bir problem oluşturmayacak.


[B]2.ADIM[/B]
Form1 sınıfımızın 2 adet elemanı var.
elemanlar Personel sınıfındaki alanları liste halinde almamızı sağlıyor.Yani bu bir Personel dizisi oluyor.
DirectoryInfo sınıfı Dizin bilgilerini saklayan bir sınıftır.Bu sınıfa daha sonra direk Exe 'nin bulunduğu dizini belirleyeceğiz.


[B]3.ADIM[/B]
Şimdi Form1 'in Load olma olayı esnasında Personel sınıfımızın özelliklerini belirleyelim. 3 Adet Personel oluşturduktan sonra elemanlar dizisine ekleme yapıyoruz.Yani; elemanlar dizisi aslında Personel listemizi tutan tek bir değişken oluveriyor.



[B]4.ADIM[/B]
[B][RED]Serialization[/B][/FONT]
Şimdi eklediğimiz verileri XML 'e serileştirelim.Yani XML formatına uygun hale getirelim.Yani artık bu sınıfın ne iş yaptığını görelim.Aşağıdaki kodları inceleyin.Satır satır açıklamaları resmin altındadır.

1.satır : Environment sınıfı ile bulunduğumuz dizini öğreniyor string dönen değeri path değişkenine aktarıyoruz.
2.satır : Form1 sınıfının elemanı olan dInfo 'ya yeni bir DizinBilgisi gireceğimizi söyledik yukarıdaki bulduğumuz dizini girdik ve kaydedeceğimiz dosya adını bildirdik.
3.satır : XMLSerializer sınıfı ile yeni bir serileştirme yapacağımızı bildirdik.Bize hangi tipte olacağını soruyor ve parametre olarak giriyoruz.Önce List<Personel> dizisinin tipini typeof() parametresi ile öğrendik ve dönen değeri XMLSerializer 'e bildirmiş olduk.
4.satır : Bir dosya açıyoruz.dInfo değişkenimizi 2 parametre ile aç veya oluştur diyoruz.
5.satır : Zaten açtığımız/oluşturduğumuz dosya üzerinde yazacağımızı ve bunun UTF8 formatında olmasını söylüyoruz.
6.satır : Serileştirme(Serialization) işlemi başladı.Yazacak eleman StreamWriter Yazılacak elemanlar ise Personel listemiz
7-10 : Eğer dosya okunacak modda ise Açıldı yazısını yazdır..Sonrada dosyayı daha sonra başka bir yerden açacağımız için burada kapatmamız gerekiyor..

[B]5.ADIM[/B]
[B][RED]Deserialization[/B][/FONT]
Şimdide dosyamızı XML dosyalarından arındırarak okuyalım.Az önce XML kodlarını yazmadan bizim için Serileştirerek kendin otomatik yaz demiştik.ve C# bunu 2 satırla bize halletti.Şimdiki isteğimiz bize bunu uygun formatta okumamızı sağla.ve o bize göstermediğin XML kodlarını burdada gösterme.İnceleyelim..

1.satır : Environment sınıfı ile bulunduğumuz dizini öğreniyor string dönen değeri path değişkenine aktarıyoruz.
2.satır : Form1 sınıfının elemanı olan dInfo 'ya yeni bir DizinBilgisi gireceğimizi söyledik yukarıdaki bulduğumuz dizini girdik ve kaydedeceğimiz dosya adını bildirdik.
3.satır : XMLSerializer sınıfı ile yeni bir serileştirme yapacağımızı bildirdik.Bize hangi tipte olacağını soruyor ve parametre olarak giriyoruz.Önce List<Personel> dizisinin tipini typeof() parametresi ile öğrendik ve dönen değeri XMLSerializer 'e bildirmiş olduk.
4.satır: Bu sefer dosyamıza sadece aç erişimi veriyoruz.Çünkü sadece okuyacağız.
5.satır: Bir string dizisi sınıfıdır.
6.satır:Deserialize işlemi başlatıldı.Dosyanın InnerText 'lerini ver.Önce List<Personel> tipinde (elemanlar)'ı tanımladık.ve yine içeriğine Deserialization yapacağımız openXML değişkeninin (List<Personel>) tipinde olacağını belirttik.
7.satır:Personel tipinde olan değerlerimizin içerisinde dönüyoruz.RichTextBox componentine aktarıyoruz.componentin elemanına aktarım yaparken hemde StringBuilder dizisine elemanları aktarıyoruz.Hem göstermiş hemde eklemiş oluyoruz.
8.satır:Açık dosyayı kapatıyoruz.