Serileştirme (Serialization)

Eyl 08, 2013
Serileştirme (Serialization) C#’ta nesneleri saklama gereksinimiyle ortaya çıkmıştır. Ters serileştirme (Deserialization) ise bir akışın nesneye dönüştürülmesi işlemidir. Serileştirme için gerekli sınıflara System.Runtime.Serialization isim uzayından ulaşılabilir. Serileştirme sayesinde nesneleri istediğimiz biçimde saklayabiliriz. .Net Framework’te serileştirme işlemi için iki metod bulunur:
  • XML ve SOAP Serileştirme (XML and SOAP Serialization)
  • İkili Serileştirme (Binary Serialization)

XML ve SOAP serileştirme (Extensible Markup Language & Simple Object Access Protocol)

Xml serileştirme veri türünü dikkate almadan bir nesnenin tüm ortak metodlarını, özelliklerini ve değişkenlerini serileştirir. Bu serileştirme tipi en çok Windows uygulamaları ve İnternet uygulamaları arasında iletişim gerektiren durumlarda kullanılır. Xml ve Soap serileştirmede tür esnekliği ön plana çıkar. Xml ve Soap açık bir standart olduğundan ve her türlü uygulama tarafından rahatlıkla okunabildiğinden veri paylaşımı oldukça hızlı sağlanabilmektedir. Yazılmış olan bir tip serileştirilebilir olarak tanımlanmazsa, bu tipi kullanan başka tiplerin de serileştirilmesi engellenmiş olur. Ancak bu sonuç, yazılan her tipin serileştirilebilir olması gerektiği zorunluluğunu doğurmaz.

Serileştirilen bir tip içerisinde, serileştirme işlemine dahil edilmesi istenmeyen alanlar için NonSerialized niteliğini kullanılır.

Xml serileştirme için aşağıdaki gibi bir örnek verilebilir:

namespace SinifKapasite
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Sinif> sinifList = new List<Sinif>();
            for (int i = 0; i < 10; i++)
            {
                sinifList.Add(new Sinif(i, i * 10));
            }
            XmlSerializer serializer = new XmlSerializer
           (typeof(List<Sinif>));
            XmlWriter writer = XmlWriter.Create("test.xml");
            serializer.Serialize(writer, sinifList, null);
            writer.Flush();
        }
    }
    [Serializable]
    public class Sinif
    {
         private int id;
         public int Id
         {
            get { return id; }
            set { id = value; }
         }
         private int kapasite;
         public int Kapasite
         {
            get { return kapasite; }
            set { kapasite = value; }
         }
         public Sinif()
         {
         }
         public Sinif(int id, int kapasite)
         {
            this.id = id;
            this.kapasite = kapasite;
         }
    }
}

Bu örnekte döngü içinde belirtilen sayıda sınıf ve bu sınıfların kapasitesi program çalışırken oluşturulan text.xml dosyasına yazdırılır, bu işlem için id ve kapasite adında iki özelliği olan serileştirilebilir Sinif sınıfı tanımlanmıştır.

İkili Serileştirme (Binary Serialization)

Nesnenin durumunun saklama ortamına uygun hale getirilip yazılması sürecince ikili serileştirme işlemi yapılır. İkili serileştirme tür bağımlılığı açısından önemlidir ve daha çok birbirinden bağımsız iki uygulama arasında nesne modellerini taşımada kullanılır. İkili serileştirme en basit yoluyla nesneye Serializable etiketi verilerek yapılır.

İkili serileştirmeye örnek aşağıdaki kod yazılabilir:

namespace ikiliserilestirme
{
    class Program
    {
        [Serializable]
        public class Ikili       
        {
            public int sayi1;
            public string strName;
        }
        static void Main(string[] args)
        {
            Ikili nesneOrnegi = new Ikili();
            nesneOrnegi.sayi1 = 15;
            nesneOrnegi.strName = "İTUBİDB";
            IFormatter bicimlendirici = new BinaryFormatter();
            Stream akis1 = new FileStream
            ("test.bin",  FileMode.Create,  FileAccess.Write);
            bicimlendirici.Serialize(akis1, nesneOrnegi);
            akis1.Close();
            IFormatter bicimlendir = new BinaryFormatter();
            Stream akis2 = new FileStream
            ("test.bin", FileMode.Open, FileAccess.Read);
            Ikili nesne = (Ikili)bicimlendir.Deserialize(akis2);
            akis2.Close();
            Console.WriteLine("{0}", nesne.sayi1);
            Console.WriteLine("{0}", nesne.strName);
        }
    }
}

Bu örnekte serileştirilebilir özellikte Ikili tipinde bir nesne oluşturulur. Ana fonksiyon içinde serileştirme yapılarak yaratılan nesne test.bin dosyasına aktarılır. Daha sonra ters serileştirme işlemiyle nesne geri alınır ve ekrana bastırılır.