C# – 18 Serialization

@ 25 Ağustos 2006 tarihinde yazdı. Yazıya yorum yazın.

Serialization

Serialization kısaca nesnenin belli bir formata göre hiçbir data kaybetmeden bir stream’e yazılmazı ve oradan tekrar okunarak nesneyi oluşturması olarak tanımlayabiliriz.

Yani sizin bir nesneniz var ve bu nesnenin tüm data üyelerindeki bilgileri disk dosyasına yazmak, daha sonra yine aynı disk dosyasından okuyarak nesnenizin yeniden oluşturmak istiyosunuız. İşte tüm bu işlemleri serialization ile yapabilirsiniz.

Şimdi niçin böyle bir şey yapmam gerekiyor ? veya ne zaman böyle bir şeyi kullanabilirim ? diyebilirsiniz. Bunun cevabını vermek için size Windows Form Programlamadaki belkide en önemli metod olan OnPaint metodundan bahsetmek istiyorum.

Graphics nesnesini kullanarak bir pencereye çizim yaptığınızı düşünelim. Şu anda çizimleriniz pencerede durmakta. Ancak bu pencerenizi büyülttüğünüzde yada pencerenizin üzerine başka bir pencere getirip, sonra tekar kendi pencerenizi aktif duruma getirdiğinizde çizdiğiniz görüntüler kaybolacaktır. Yani pencerenizin gözükmeyen kısmı görünür duruma geldiğinde çizimleriniz kaybolacaktır. ( Bu konuyu daha detaylı olarak Windows Forms kısmında inceleyeceğiz ) işte pencerenizin gözükmeyen kısmı gözükür duruma geldiğinde Paint olayı meydana gelir ve OnPaint metodu çağrılir. Sizde bu metod da çizimlerinizi tekar yaptırırsınız. Hatta sadece bozulan kısmı tekrar çizdirerek daha güzel bir tasarım yapabilirsiniz.

Bu çizimleri tekrar yaptırmanız için mouse’a ait tüm x,y noktalarını saklamalısınız ve sonrada bu noktaları takip ederek çiziminizi tamamlamalısınız.

Çizim için gerekli bilgileri bir sınıf yapısı halinde tuttuğunuzda nesnenin tüm data üye elemanlarını disk dosyasına veya database’e yazacak ve yine disk dosyasından veya database’den okuyarak nesneyi yaratacak fonksiyonlara ihtiyacınız vardır. Ancak serialization bunları sizin yerinize yapar.

Serialization işlemi için nesnenin serialization yapılabilir olması gerekmektedir.

Bunun için sınıfın basına [Serializable] attribute’u getirilmelidir. Böylece CLR sizin yerinize nesnenizi serialize hale getirecektir. Bununla birlikte CLR CTS uyumlu türlerin serialize edilebilir olduğunu bilmektedir. Eğer bir sınıf [Serializable] attribute ile belirtilmezse CLR bu sınıfı serialize edemeyecektir. Bununla birlikte birde sınıfın hangi formata göre yazılacağının belirtilmesi gerekiyor. Burada iki tane formattan bahsedebiliriz.

SoapFormatter : SOAP XML tabanlı bir protokoldur. Web üzerinde bilgi alışverişinde kullanılır. SoapFormatter genellikle web servislerinde kullanılır.
BinaryFormatter : Local olarak dataların saklanmasında arzu edilen bir formattır ve hızlıdır.

BinaryFormatter türünden bir nesne yaratılır ve bu nesnenin Serialize metodu ile datalar stream’e yazılır, Deserialize metodu ile stream’den okunarak nesne yaratılır.

Aşağıdaki örnekte basit olarak MouseRecord adına bir sınıf yaratılmıstır. Bu sınıfın X ve Y data üye elemanları bir disk dosyasına serialization işlemi ile yazılmakta ve daha sonra tekrar disk dosyasından okunarak nesne yaratılmaktadır.

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.Serialization.Formatters.Binary;

using System.Runtime.Serialization;

using System.IO;

namespace SerializationFile

{

[Serializable]

class MouseRecord

{

private int x;

private int y;

public MouseRecord(int x, int y)

{

this.x = x;

this.y = y;

}

public void Seri(FileStream fs)

{

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(fs, this);

}

public MouseRecord DeSeri(FileStream fs)

{

MouseRecord mr;

BinaryFormatter bf = new BinaryFormatter();

mr = (MouseRecord) bf.Deserialize(fs);

return mr;

}

public void DispMouseRecord()

{

Console.WriteLine(“X:{0}”, x);

Console.WriteLine(“Y:{0}”, y);

Console.WriteLine(“————————-”);

}

}

class Program

{

static void Main(string[] args)

{

FileStream f = new

FileStream(@”C:\FileData.txt”, FileMode.Create);

MouseRecord o = new MouseRecord(10, 20);

o.Seri(f);

o = new MouseRecord(11, 21);

o.Seri(f);

o = new MouseRecord(12, 22);

o.Seri(f);

f.Close();

f = new FileStream(@”c:\FileData.txt”, FileMode.Open);

try

{

o = o.DeSeri(f);

o.DispMouseRecord();

o = o.DeSeri(f);

o.DispMouseRecord();

o = o.DeSeri(f);

o.DispMouseRecord();

}

catch (SerializationException)

{

f.Close();

}

}

}

}

c-18-serialization

S.Murat GEDIKOGLU
MCP,MCAD.Net
mgedik@ceturk.com