C# Dilinde Serialization
Serialization, Class içerisinde method,field değerlerinin saklanması ve istenen durumlarda bu değerlerin kullanılmasıdır. Örneğin Class’ınızda aşağıdaki gibi bir tanımlama yaptınız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication8
{

class Class1
{
string banka = “”;
}
}

Programınız gereği her seferinde(açılış kapanışta) “banka” isimli değişken yeni bir değer alacaktır. Öyle durumlar olur ki siz bu banka değişkeninin son aldığı değeri bir yerde tutmak istersiniz. Sanırım aşağıdaki örnek konunun anlaşılması için yeterli olacaktır.

ÖRNEK DURUM 1:
Çalıştığım projede şu an yazılımları bitirmiş ve ara isteklere destek vermekteyiz. Proje gereği adaylar başvuru yapmakta ve bunlara ait bilgiler operatörler tarafından girilmektedir. Programların kullanım performanslarının artması için operatörlerimiz bizden yeri geldikçe istekte bulunmaktadır. Geçen aylarda gelen isteklerden biri “Makbuz Modülündeki” bir iyileştirme ile ilgiliydi. Buna göre operatörlerin sıkıntı çektiği konu, programı her açtıklarında bir çok bankanın olduğu listeden yeniden seçim yapmak zorunda kaldıkları idi. Bu yüzden programı kapattıkları zaman son banka değerinin korunmasını istediler. Belki aklınıza Ado.Net ile son banka değerini veritabanına yazmak gelebilir ama bu tür isteklerin çok fazla olduğunu düşünürseniz işi veritabanından değilde kullanıcıdan (client) yapmak daha mantıklı olacaktır. İşte bu gibi durumlarda Class içerisindeki banka değerini “Serialize” edebilirsiniz.

ÖRNEK DURUM 2:
Programlarınızı yazdıktan sonra kullanıcılar program renklerini kendileri belirlemek isteyebilirler. Zaten kullandığımız bir çok programda biz de kendimize göre renkler seçeriz. Kullanıcı renkleri değiştirdikten sonra programı tekrar açtığı zaman değerler normal şartlarda korunmayacaktır. Yine bu yüzden Programda kullanılan renkleri serialize ederek bir sonraki açılışta kullanabilirsiniz. Böylece kullanıcının belirlediği renkler korunmuş olacak.

Proje

1-Şimdi Yeni bir Windows Projesi oluşturunuz ve Formunuza bir adet Combobox ekleyiniz. Combobox’a istediğiniz kadar banka ismi ekleyiniz.

2-Project/Add Class yolunu izleyerek bir adet Class ekleyiniz. Ben ismini değiştirmedim. Class1 olarak kaldı. Siz isterseniz değiştirebilirsiniz.

3-Class1 Classına aşağıdaki kodları ekleyiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication8
{
[Serializable] //Ekleyiniz

class Class1
{
string banka = “”;

public string bankaIsmi
{

get
{
return banka;
}

set
{
banka = value;
}
}
}
}

Burada yaptığımız işlem çok basit. Bir değişken tanımladık ve bu değişkeni kullanmak için property yazdık.

4-Şimdi Formunuzdaki ilgili eventlere aşağıdaki kodları ekleyiniz.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization; //Ekleyiniz
using System.Runtime.Serialization.Formatters.Binary; //Ekleyiniz
using System.IO; //Ekleyiniz

namespace WindowsFormsApplication8
{

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Class1 yeni = new Class1();
private void Form1_Load(object sender, EventArgs e)
{

try
{
IFormatter oku = new BinaryFormatter();
FileStream dosyaOku = new FileStream(“banka.txt”, FileMode.Open, FileAccess.Read);
yeni = (Class1)oku.Deserialize(dosyaOku);
dosyaOku.Close();
comboBox1.SelectedItem = yeni.bankaIsmi;
}

catch
{ }
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
yeni.bankaIsmi = comboBox1.SelectedItem.ToString();
IFormatter yaz = new BinaryFormatter();
FileStream dosyaYaz = new FileStream(“banka.txt”, FileMode.Create, FileAccess.Write);
yaz.Serialize(dosyaYaz, yeni);
dosyaYaz.Close();
}
}
}

5-Burada yaptıklarımızı açıklayalım.

* Öncelikle “comboBox1_SelectedIndexChanged” eventinde “yeni.bankaIsmi = comboBox1.SelectedItem.ToString();” diyerek Class1 sınıfındaki bankaIsmi isimli değişkeni değiştirdik.

* “IFormatter yaz = new BinaryFormatter();” ile serialization yapabilme ortamı sağladık.

FileStream dosyaYaz = new FileStream(“banka.txt”, FileMode.Create, FileAccess.Write); ile “banka.txt” isimli bir txt dökümanına Class değerlerini yazabilme ortamı oluşturduk

* yaz.Serialize(dosyaYaz, yeni); ile Class değerlerini Serialize ettik.

* Tabiki Formumuzun “Load” olayında ise Serialize edilmiş olan yani dosyaya yazılmış olan class değerlerini okuduk. Try-Catch bloğu oluşturmamızın nedeni ise program ilk kez çalıştırıldığında okunacak bir dosyanın olmamasıdır.

Umarım işinize yarayacaktır. Diğer yazılarımda görüşmek dileğiyle…