C#’ta XML Serialization ve Deserialization

Kısaca serileştirmeyi tanımlayacak olursak; serileştirme , elimizdeki mevcut nesne(ler)i istenilen formata getirmeye yarıyor diyebiliriz. Bunlardan en bilinenleri XML Serileştirme , JSON Serileştirme , Binary Serileştirme. (Kendinize yeni bir format geliştirirseniz o şekilde de serileştirebilirsiniz.)

Herneyse konumuza dönecek olursak XML DOM’daki gibi tek tek appendNode , insertElement tarzındaki methodları kullanmadan nesnelerimizi direk olarak nasıl XML formatına dönüştürürüz daha doğrusu bu işi C#’ta basit olarak nasıl yaparız ondan bahsedeceğim. (Not: Java’da benzer işlemi yapmak istiyorsanız JAXB sizin için yararlı olacaktır.)

Öncelikle serileştirmek istediğim nesnelerin türetileceği sınıfı yazıyorum. Kişilere ait belirli nitelikleri tutan Person adında bir sınıfım var.

public class Person { public string name { get; set; } public string cell_phone { get; set; } public string hometown { get; set; } }

Şimdi ise elimde bulunan birden çok kişi nesnesini bir listede tutacağım ve bu listeyi nasıl serileştireceğimizi göstereceğim. İlk olarak listemizin tanımını yapıp , kişileri bu listeye ekliyorum.

List personList = new List(); personList.Add(new Person { name = “Robert de Niro”, cell_phone = “5*********”, hometown = “Los Angeles , LA” }); personList.Add(new Person { name = “Al Pacino”, cell_phone = “+1***********”, hometown = “New York” }); personList.Add(new Person { name = “Morgan Freeman”, cell_phone = “+1***********”, hometown = “Chicago” });

Sıra geldi serileştirme işlemini yapan kod kesimini yazmaya. Bunun için System.Xml.Serialization namespace’inden yararlanacağız ve bu namespace te yer alan XmlSerializer sınıfını kullanacağız.

XmlSerializer serializer = new XmlSerializer(typeof(List)); TextWriter writer = new StreamWriter(“datas.xml”); serializer.Serialize(writer, personList);

Nesnelerimiz belirttiğimiz adreste bulunan XML dosyasına yazılmış bulunuyor.

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/08/serial-300×153.png “serial”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/08/serial.png)

Şimdi de bu işlemin tam tersini yani mevcut XML’den nesne elde etme işlemi de benzer şekilde birkaç satır kod ile yapılabiliyor.

XmlSerializer serializer = new XmlSerializer(typeof(List)); TextReader reader = new StreamReader(“datas.xml”); personList = (List)serializer.Deserialize(reader);

357 Words

Can Sıkıntısında Bilgisayar Başında Yapılabilecekler – 1

class Program { static void Main(string[] args) { for (int i = 144; i < 1000; i += 100) Console.Beep(i, 100); for (int i = 2500; i >= 144; i -= 250) Console.Beep(i, 100); } }

Bu kodu C#’ta bir projeye dahil etmek ve hatta kendiniz bir sınıf yazıp notaların frekans değerlerinden , vuruşların sürelerine kadar belirli nitelikleri önceden tanımlayıp o şekilde şarkılar çalmak.  C++’da benzer işlemi yapmak için “Windows.h” headerını  koda ekleyip Beep fonksiyonunu kullanabilirsiniz.

Güzel bir paylaşım bu linkte mevcut:
[http://oguzkoroglu.net/post/2011/01/16/ConsoleBeep().aspx](http://oguzkoroglu.net/post/2011/01/16/ConsoleBeep().aspx)

100 Words

C#’ta Reflection – 2

Geçen yazımda Reflection’a dair temel bilgileri ve ismini bilmediğimiz bir metodu nasıl çağıracağımızı öğrenmiştik. Bu yazımda ise C#’ta yazılmış bir DLL dosyasının içindeki sınıflara nasıl erişiriz , bu sınıflardan nasıl nesneler oluşturabiliriz onlardan bahsedeceğim. (Tabi ki tüm bunlar çalışma zamanında olacak)

Bu DLL dosyası içinde bulunan sınıfın constructor ına  erişerek nesne yaratmam için aşağıdaki kodu kullanıyoruz.

//DLL dosyasının yüklenmesi Assembly asm = Assembly.LoadFile(@”C:\Ornek.dll”); object obj; //DLL dosyası içindeki sınıf bilgilerinin elde edilmesi foreach (Type type in asm.GetTypes()) { //Sınıflara ait constructor bilgilerinin elde edilmesi foreach (ConstructorInfo cInfo in type.GetConstructors()) { // Constructor ın aldığı parametre tipine göre // o tipten parametre kullanılarak nesne // yaratılması if (cInfo.GetParameters()[0].ParameterType == Type.GetType(“System.Int32”)) { obj = Activator.CreateInstance(type, 3); } else if (cInfo.GetParameters()[0].ParameterType == Type.GetType(“System.String”)) { obj = Activator.CreateInstance(type, “deneme”); } } }

* Dipnot=  Bu kodu yazarken varsayım olarak constructor’ın tek bir parametre aldığını varsaydık ve bu aldığı parametrenin tipi *Int32* veya *String* ise nesnenin yaratılmasını istedik.

207 Words

C#’ta Reflection

Program yazarken çoğu zaman Ctrl+Space kombinasyonu ile kullandığımız methodların dönüş değerlerine, aldıkları parametrelere , parametrelerin tipine vs gibi özelliklerine bakarız. Çoğu IDE sayesinde bunlara da erişmiş oluruz. Bu noktada birkaç senaryo üzerinden devam edelim.

1. Senaryo ) Bir sınıfın içindeki methodlara ait bilgilerin edinilmesi. (klasik senaryo)
2. Senaryo ) Başka birisinin yazmış olduğu bir sınıf var. Normal koşullarda o kod dosyasını açmadan “private”  , “protected” tipinde olan methodların , niteliklerin isimlerini öğrenemezsiniz. Bu durumda da yardıma koşuyor.
3. Senaryo ) Basit olarak JavaDOC benzeri bir aracı C# için yazmak istediniz. Burada da yorum methodlardan , niteliklerden önce yorum satırlarını okuyup onlara ayrıştırmak yerine Reflection sayesinde basit olarak buna benzer bir araç geliştirebilirsiniz.
*** 4. Senaryo ) Bayağı bir zamandır merak ettiğim ve yeni öğrendiğim birşey. İsmini bilmediğimiz bir methodun ismini çalışma zamanında öğrendik fakat biz bu methodu çalışma zamanında çağırabilir miyiz? Yani demek istediğim yaz() diye bir method var ve biz bu methodun ismini kodu yazarken bilmiyoruz ama çalışma zamanında çağırmak istiyoruz.

Bu kadar senaryodan sonra basit olarak ismini bildiğimiz bir sınıfın methodlarına ait bilgileri nasıl ediniriz diyerek kod kısmına geçelim.

Type intType = Type.GetType(“System.Int32”); foreach (MethodInfo mInfo in intType.GetMethods()) { Console.WriteLine(“————————————“); //Methodun ismi Console.WriteLine(mInfo .Name + ” “); int counter = 0; foreach (ParameterInfo pInfo in mInfo .GetParameters()) { //Methodun aldığı parametrelerin tipleri Console.WriteLine(counter + “. param tipi= ” + pInfo.ParameterType + ” “); counter++; } //Donus değerinin tipi Console.WriteLine(mInfo .ReturnType); Console.WriteLine(“————————————“); }

Yukarıdaki kod ile erişim belirleyicisi(access modifier) ne olursa olsun tüm methodlara dair bilgileri edinmek istersek GetParameters() methoduna parametre olarak BindingFlags’ler vermemiz gerekir. “BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static” şeklinde parametre verirsek tüm methodlara ait bilgilere erişebiliriz.

Geldik bana göre en can alıcı kısma. Şimdi de ismini çalışma zamanında öğrendiğimiz bir methodun yine çalışma zamanında nasıl çağrılacağını gösteren basit bir kod parçasını inceleyelim. Bu kod parçasında sınıfın ilk methodunu çağırıyorum. Buna göre kodun çıktı olarak “deneme123” vermesi gerekiyor. Gerçekten de kodu çalıştırdığımız zaman beklediğimiz sonucu ekranda görüyoruz.

class Boxer { public void test() { Console.WriteLine(“deneme123”); } }

Type unknownBoxer = typeof(Boxer); unknownBoxer.GetMethods()[0].Invoke(new Boxer() , null);

418 Words