C# DILINDE SETTINGS FILE ve SERIALIZATION KAVRAMININ BIRLIKTE KULLANILMASI

Merhaba arkadaslar bu makalemde Engin Hocamizin hazirlamis oldugu Serialization konusuna biraz daha açiklik getirecegim ve daha ileri bir örnek yaparak bu konunun siz üyelerimiz tarafindan daha anlasilir olmasini saglayacagim. C# ta Settins File ve User Setting (Kullanici Ayari) Kullanimi adli makalemde yapmis oldugum uygulamayi devam ettirerek yaptigimiz renk degisikligini Serialization mantigiyla kalici hale getirecegim. Böylelikle bir programlama dilinde tüm konularin nasil bir zincirin halkalari gibi birbirine bagli oldugunu çok daha iyi anlayacaksiniz.

Ilk olarak serialization mantigini kavramaya çalisalim. Serialization, classlara ait özellikleri veya degisken degerlerini bir dosyada saklayip daha sonra okunmasini saglar. Buda bize program içerisinde yaptigimiz degisikliklerin kalici olmasina olanak verir. Peki ne tür bir degisiklik? Örnegin bir combobox ta Türkiye’nin Sehir adlari yaziyor. Sizde sirayla her sehri seçip o sehirle ilgili islem yapiyorsunuz ama bazi durumlarda (ögle tatili vs) programi kapatmaniz gerekiyor. Siz programi tekrar açtiginizda Comboboxta son kaldiginiz sehir degil de ilk sehir listelenecektir. Iste bunun önüne geçmek için Serialization ideal bir kullanim olacaktir. Baska türlü nasil yapabilirim? Ilk akla gelen son degeri veri tabaninda tutup daha sonra oradan ilgili kaydi çekmek olacaktir. Bu yanlis bir çözüm yolu degildir ama gereksiz ve daha uzun bir yoldur. Çünkü bu tür kisisel kullanimlar için veri tabanini mesgul etmek veya kalabaliklastirmak pekte önerilen bir durum degildir. Ayrica bunu her kullanici için yapmaniz gerek. Bakin buda çok önemli sizin yazmis oldugunuz uygulamayi tek SQL Server (ya da farkli bir veri tabani) altinda onlarda kisi kullaniyorsa her kullanici için ayri bir deger tablosu tutmaniz gerecektir. Zira bir kullanici Istanbul ile ilgili islem yaparken, baska bir kullanici da Ankara ile ilgili islem yaparken programi kapatabilir. Ayrica bu tür islemlerde veriyi veri tabanindan degil de bir dosyadan çekmek daha hizli olacaktir.

Konuyu daha fazla uzatmayalim. Mantigini anladiniz sanirim. Simdi gelelim yapacagimiz örnege. Örnegimizde daha önce Settings File kullanarak yaptigimiz form rengi degisikligini kalici hale getirecegiz. Bunun için önce C# ta Settins File ve User Setting (Kullanici Ayari) Kullanimi adli makalemizi mutlaka okumaniz gerek. Çünkü simdi yapacagim uygulama onun devami niteliginde olacaktir. Neyin nerden geldigini bilelim J Uygulamasini yaparsaniz sizin için daha yararli olacaktir.

1- Hatirlamak için!! kullandigimiz form asagidaki gibiydi.

csharpta-settins-file-ile-serialization-kavraminin-bi-1

csharpta-settins-file-ile-serialization-kavraminin-bi-1

2- Yaptigimiz Ayar asagidaki gibiydi.

csharpta-settins-file-ile-serialization-kavraminin-bi-2

csharpta-settins-file-ile-serialization-kavraminin-bi-2

3- Formumuzu ve ayarimizi olusturmustuk ve bunu iliskilendirmistik. Seçtigimiz renk, formumuzun arka plan rengini degistirse de kapatip açtigimizda yine eski halini aliyordu. Simdi kaldigimiz yerden devam edelim ve renk degisimini kalici hale getirelim. Yeni bir class olusturalim. Classimizin adi Class1.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing; //EKLEYIN

namespace WindowsFormsApplication2
{
[Serializable] //1
class Class1
{
Color renk = Ayarlar.Default.FormArkaPlanRengi; //2

public Color RenkAta
{

get
{
return renk; //3
}

set
{
renk = value;
}
}
}
}
Using satirina System.Drawing kütüphanesini ekliyoruz

//1 Bu class içerisine [Serializable] bildirisini ekleyerek bu classin bu amaçla kullanildigini belirtiyoruz.
//2 Renk adinda Color türünde bir degisken tanimladim ve degerini Settings File deki FormArkaPlanRengi nden aldim. Bir renk atamasi olacagi için ve bize bir renk döndürecegi için Color olarak tanimladim. Drawing kütüphanesini eklememdeki sebepte Color i kullanabilmekti.
//3 Tanimlamis oldugum degiskeni kullanmak için bir property yazdim.

4- Classla yapacagimiz islemler bu kadar. Simdi form üzerindeki kontrollere uygulayacagimiz degisikliklere gelelim.

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; //EKLEYIN
using System.Runtime.Serialization.Formatters.Binary; //EKLEYIN
using System.IO; //EKLEYIN

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

Class1 yeni = new Class1(); //yavru degisken olusturduk.
private void button1_Click(object sender, EventArgs e)
{

colorDialog1.ShowDialog(); //1
Ayarlar.Default.FormArkaPlanRengi = colorDialog1.Color; //1
yeni.RenkAta = colorDialog1.Color; //2
IFormatter yaz = new BinaryFormatter();
FileStream dosyaYaz = new FileStream(“renkKodu.txt”, FileMode.Create, FileAccess.Write); //3
yaz.Serialize(dosyaYaz, yeni);
dosyaYaz.Close();

}

private void Form1_Load(object sender, EventArgs e)
{
try
{
IFormatter oku = new BinaryFormatter();
FileStream dosyaOku = new FileStream(“renkkodu.txt”, FileMode.Open, FileAccess.Read);
yeni = (Class1)oku.Deserialize(dosyaOku); //4
dosyaOku.Close();
Ayarlar.Default.FormArkaPlanRengi = yeni.RenkAta; //5
}

catch
{ }
}
}
}

Serialization ile ilgili islem yapabilmek için ilgili kütüphaneleri ekliyoruz. Renkkodu.txt hiçbir yol belirtmedigimiz için projemizde, debug klasorü içerisinde olusturulacaktir.

· 5- Butonun click evetine gidelim ve butona bastigimiz andaki yapilacak islemleri gözlemleyelim.

//1 Iki kod satirini zaten önceki makalemizde belirtmistik. Renk paletinden renk seçmemizi ve seçtigimiz rengin formun rengine etki etmesini sagliyor. Böylece Settings File deki FormArkaplanRengi adli ayarimizin value kismini degistirmis olduk.
//2 Seçtigimiz rengi, yazdigimiz Property deki degere aktardik. Seçtigimiz rengi renk paletinden degil de Classta belirttigimiz gibi olusturdugumuz ayardan aliyor.
//3 Yazimizin basinda Serialization un claaslara ait özellikleri, bir dosyaya kaydetmesini saglar demistik. Property yazmamizin ve bir üst satirda seçtigimiz rengi propertye aktarmamizin amaci bu. Daha sonraki islemler ise Serialization ortami ve class bilgilerini atacagimiz dosyayi olusturmak. Ve class bilgilerini dosya içerisine yazdirmak oldu. Serializationun kullanimi bu sekildedir.

6- Formumuzun Load eventine gidelim. Çünkü dosyaya yazdigimiz verileri form yuklenir yuklenmez uygulanmasini istiyoruz.

//4 Burada olusturdugumuz dosya içerisindeki bilgileri aliyoruz. Bu kisimlari hizli geçiyorum. Çünkü Engin Hocam daha ayrintili bir sekilde baska bir makalede belirtti. O makalenin linkinide yazimin sonunda verecegim.
//5 Dosyamizin içerisine Classimizi atmistik bu classimiza da seçtigimiz son rengin degerini atmistik. Üstte bulunan kod satirlarinda Classimizi son biraktigimiz degerleriyle geri aktarmistik. Simdi ise Settings Filedeki ayarimiza classta bulunan degeri aktariyoruz. Zaten ayarimizi form arka plan rengi ile binding yaptigimizdan (Önceki makalemizde yaptik) dolayi otomatik olarak son biraktigimiz renk seçenegi karsimiza gelecektir.

** Programi yazdiginizda ve ilk kez çalistirdiginizda Form yüklenirken herhangi bir dosya bulamayacagi için hata verecekti. Bu nedenle Try-Catch blogu içerisinde aldik.

Artik programi kapatip açtiginiz bile yapmis oldugunuz renk degisimi kalici hale gelmis oldu.

Oldukça karisik bir uygulama gibi görünse de mantigini kavradiktan sonra yaptigimiz islemlerin nasil birbirleri ile iliskili oldugunu görüyoruz.

Konu ile Ilgili Diger Makaleler ve Videolar:
1-C# ta Settins File ve User Setting (Kullanici Ayari) Kullanimi
2-C# Dilinde Serialization

· Iyi Çalismalar….