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

Diffie – Hellman Key Exchange

Diffie Hellman anahtar değişimi geliştirilmiş en eski anahtar değişimi yollarından biridir. Güvenli olmayan ağda 2 kullanıcının birbirlerini tanımaları daha doğrusu birbirlerine yetki vermeleri için kullanılan bir yöntemdir. Bu yöntem basit olarak şu şekilde işler:

**1)*** P > G olacak şekilde 2 asal sayı seçilir.*
**2)***Kullanıcılar rasgele bir sayı üretirler.*
**3)***Kullanıcılar ürettikleri sayı doğrultusunda G^(Sayi) % P şeklinde anahtar elde ederler.*
**4)***Daha sonra bu anahtarları birbirlerine gönderirler.*
**5) ***Kullanıcı, diğer kullanıcıdan gelen bu anahtarı kullanarak G^(gelen anahtar) % P değerlerini hesaplar ki bu değer her iki kullanıcıda da aynı olur işte bu elde edilen değer gizli anahtarımızdır.*

***not =**Aşağıdaki resim en.wikipedia.org adresinden alınmıştır*.

![wikipedia.org dan alıntıdır](http://upload.wikimedia.org/wikipedia/en/c/c8/DiffieHellman.png “wikipedia.org dan alıntıdır”)

Diffie Hellman Anahtar Değişiminin Python dilinde gerçekleştirimi

import random def calcSecret(G , p , randomNum): secret = G ** randomNum secret = secret % p return secret def randomGenerator(): num = random.randrange(15) return num alice = randomGenerator() print “Alice’s number ” , alice bob = randomGenerator() print “Bob’s number ” , bob alicesecret = calcSecret(11 ,29 , alice) bobsecret = calcSecret(11 , 29 , bob) print “Alice’s secret ” , alicesecret print “Bob’s secret ” , bobsecret lastsecret1 = calcSecret(bobsecret , 29 , alice) lastsecret2 = calcSecret(alicesecret , 29 , bob) print lastsecret1 , ” ” , lastsecret2

236 Words

Huffman Sıkıştırma Algoritması

İyi günler.

Bu yazımda sizlere [Huffman Sıkıştırma Algoritması](http://tr.wikipedia.org/wiki/Huffman_kodu)ndan bahsedeceğim.

İlk olarak Huffman algoritmasından bahsetmek istiyorum. Huffman algoritması temel olarak bir metinde yer alan karakterlerin frekanslarını bularak belli bir düzende Huffman ağacına yerleştirilmesine ve buradan erişilmesine dayanıyor. Biraz daha açıklayıcı konuşalım. Bilgisayarda karakterler 8bit(1 byte) olarak saklanır. Huffman algoritmasındaki asıl amaç karakterlerin kapladığı alanı azaltarak sıkıştırma yapmak.

Mesela bir örnek vermek gerekirse diyelim “AAAABBBCC” diye bir metnimiz var. Normalde bu metin herbir karakter 8bit kaplayacak şekilde yani toplamda 8*9 bitte saklanır. Huffman algoritmasına göre ise şu şekilde saklıyoruz:

**1-**Öncelikle karakterlerin metinde bulunma sıklığı(frekans) larını buluyoruz.
A karakteri metinde 4 kere geçmiş yani frekansı 4
A:  4   ,   B:  3   , C:   2
**2-**Bundan sonra yapılacak işlem en düşük frekansa sahip iki elemanı seçerek onlardan ağaç oluşturma işlemi

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree1.jpg “tree1”)](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree1.jpg)

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree2.jpg “tree2”)](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree2.jpg)

**3-** Şimdide bu karakterlerin yeni hallerinin ne olacağına. Ağaçta kökten itibaren eğer karakterimiz sol alt ağaçta bulunuyorsa koda 0 ekliyoruz , eğer karakter sağ alt ağaçta ise 1 ekliyoruz. Buna göre:

A: 0 oluyor
B: 11
C: 10

**Sonuç:** Normalde “AAAABBBCC” metinini 8*9 bit ile saklıyorduk. Şimdi ise bu metni şu şekilde saklıyoruz.

AAAA  = 0000
BBB = 111111
CC = 1010

“AAAABBBCC” = 00001111111010 yani 14 bit.

Sıkıştırma oranı ((72- 14) / 72) * 100 = %80 oranında sıkıştırdık.

283 Words

Java’da Comparable Arayüzü

İyi akşamlar.

Diyelim ki Java’da Integer tipinde değişken tutan bir kolleksiyonum var. Aşağıdaki gibi yazmışım kodunu da

ArrayList test = new ArrayList(); test.add(9); test.add(4); test.add(1); test.add(30); test.add(25); test.add(100); for(Integer i : test) System.out.print(i + ” “);

Yukarıdaki kodu; yazmış olduğumuz sınıfta ilgili methodun içinde kullanınca , çıktı olarak *ArrayList *e eklenme sırasına göre bir çıktı görürüz. *ArrayList *i belli bir sıraya sokmak istediğimizde *Collections.sort()* methodunu kullanırız. Örneğin yukarıdaki kodda 9. satırdan sonra aşağıdaki kodu yazdığımız varsayalım.

Collections.sort(test);

Kodu tekrar çalıştırdığımızda çıktının sıralı olacağını göreceğiz. *Collections.sort() *methodu birden çok overload u bulunan (String , Integer , …) bir methodtur. Ve Java’da kolaksiyonlar içindeki verileri sıralamada kullanılır.

Şimdi gelelim bizim asıl senaryomuza. Senaryomuz şöyle diyelim benim Insan diye bir sınıfım var. Ve bu sınıfın içinde *ad* ve *yas* diye iki değişkenim olsun. Ben bu niteliklerle oluşturduğum Insan nesnelerini *ArrayList*‘te tutmak istiyorum ve yine rasgele sırada bir dağılım olduğunu düşünelim. Ben bu listemi Insan tipi nesnelerin yas bilgisini kullanarak nasıl sıralarım? İşte senaryom bu.

Bunun için *Comparable* arayüzünü Insan sınıfıma implement ederek *Comparable *arayüzünün içinde bulunan *compareTo* methodunu override edeceğim.

public class Insan implements Comparable { public int yas; public String ad; public Insan(int yas , String ad) { this.yas = yas; this.ad = ad; } public int compareTo(Object o1) { if (this.yas == ((Insan) o1).yas) return 0; else if ((this.yas) > ((Insan) o1).yas) return 1; else return -1; } }

Aşağıdaki kodla denememizi yapalım bakalım çalışıyor mu?

ArrayList test = new ArrayList(); test.add(new Insan(18, “Chuck Bass”)); test.add(new Insan(17, “Blair Waldorf”)); test.add(new Insan(27, “Behlul”)); test.add(new Insan(22, “Bihter”)); test.add(new Insan(55, “Adnan”)); test.add(new Insan(70, “Ramiz Karaeski”)); test.add(new Insan(65, “Kenan Birkan”)); test.add(new Insan(30, “Ezel”)); Collections.sort(test); for(Insan i : test) System.out.println(i.yas + ” ” + i.ad);

Şimdi biraz daha fantastik birşey yapalım. Mesela diyelim ki yaşları aynı olan insanları da ad sıralamasına sokmak istiyorum. Bu örnekte fantastik oldu ama kullanılır bir yerlerde. Neyse bakalım bunu yapabilmek için de compareTo methodumuzu nasıl eziyoruz.

public int compareTo(Object o1) { if (this.yas == ((Insan) o1).yas) { if (this.ad.compareTo(((Insan)o1).ad)>0) return 1; else return -1; } else if ((this.yas) > ((Insan) o1).yas) return 1; else return -1; }

Yukarıdaki koda da dikkatli bakarsanız birşeyin dikkatinizi çekmesi lazım. O da ya adları da aynı olursa öle bir durumda ilk olarak hangi nesneyi eklediysek onu yazacak ![:)](http://www.onurbaysan.com/blog/wp-includes/images/smilies/icon_smile.gif)

499 Words

CSS ile Seçilen Metin Renginin Değiştirilmesi

Blogumda dikkat ettiyseniz herhangi bir metni seçtiğinizde ; seçilen metnin arkaplan rengi varsayılan renk olan mavi değil yeşil oluyor. (Tarayıcınız IE haricinde birşeyse !)

Bunu CSS yardımıyla aşağıdaki kodu kullanarak yapabiliyoruz.  Fakat burdaki tek sorun bu stil Internet Explorer’da çalışmıyor.

::-moz-selection { background:#009900; color:#fff; } ::selection { background:#009900; color:#fff; }

63 Words

Bir Metottan Birden Çok Parametre Döndürme

Programlama dillerinde bir fonksiyondan hepimizin bildiği üzere sadece bir parametre döndürebiliriz. Buradaki döndürmekten kasıt yapılan “*return*” işlemiyle sadece bir parametre döndürdüğümüzdür. Peki eğer birden çok parametre döndürmek istersek ne yaparız? Bunun için 3 methodtan bahsedeceğim.

C’ye alışkın insanların bu soruya vereceği cevap “struct” kullanırız olacaktır. Struct tanımı içinde kullanmak istediğimiz parametreleri belirtir fonksiyonun dönüş tipini de tanımladığımız Struct türünden yaparsak bu işi başarıyla gerçekleştiririz.  OOP’de bunu sınıflar aracılığıyla yaparız.

1. Method:

class Program { static void Main(string[] args) {      Parameters x = foo(); Console.WriteLine(x.a + ” – ” + x.b); Console.ReadKey(); /* Konsolun işlemden sonra herhangi bir tuşa basılana kadar açık kalmasını sağlamak için */ } static Parameters foo() {      Parameters param = new Parameters(); param.a = 5; param.b = 8; return param; } } class Parameters { public int a, b; }

2. Method: Bu methodumuzda “out” parametresini kullanmak olacaktır.

static void Main(string[] args) { int x, y; x = foo(out y); Console.WriteLine(x + ” – ” + y); Console.ReadKey(); /* Konsolun işlemden sonra herhangi bir tuşa basılana kadar açık kalmasını sağlamak için */ } static int foo(out int var1) { var1 = 5; return 8; }

3. Method: .Net Framework 4.0 ile gelen [Tupples](http://msdn.microsoft.com/en-us/library/system.tuple.aspx)

static void Main(string[] args) {    var result = foo(); Console.WriteLine(result.Item1 + ” – ” + result.Item2);    Console.ReadKey(); /* Konsolun işlemden sonra herhangi bir tuşa basılana kadar açık kalmasını sağlamak için */ } static Tuple foo() { return Tuple.Create(3 , “uccccc”); }

Son örnek hariç diğer örnekler hep aynı türden veriler kullanmışım fakat önceki örneklerde de farklı türden veriler kullanmamız mümkün. Ayrıca aynı türe sahip veriler için kullanılacak başka methodlarda mevcut. Mesela *Collections *kullanımı.

İyi akşamlar

333 Words