.Net Serialization & Deserialization

.Net serialization DeSerialization işlemleri

628

Serialization (Serileştirme) & Deserialization

Bu makalemizde Serialization (Serileştirme) & Deserialization işlemlerini ele alacağız. .Net Framework içinde hali hazırda bize sunulan iki adet yapı mevcuttur. [ BinarySerialize ve XmlSerialize ] Ek olarak kullanabileceğimiz JsonSerialize yapısı da serialize işlemlerinde özellikle servis tabanlı veya web projelerinde oldukça fazla kullanılmaktadır.

  • Serialize & Deserialize İşlemi Nedir ?

    • Serialization işlemi en basit anlamıyla nesnenin o anki durumunun belirlenen yöntem doğrultusunda saklamasıdır. Bellek (Memory) , Dosya (File) , veri tabanı (Database) bazlı saklama işlemleri yapılabilir. İstenildiğinde serialize edilmiş obje DeSerialize işlemi ile birlikte tekrar kullanıma uygun hale getirilebilir. Serialization işlemleri genel olarak dosya gönderme, veritabanı üzerine dosya kaydetme, nesne üzerinden veri taşıma gibi durumlarda kullanılmaktadır.

 

Binary Serialization

BinarySerialization ‘ın en önemli özelliklerinden biri tip güvenli olmasıdır. Serialize edeceğiniz nesne deserialize işleminde aynı şekilde size dönecektir. BnarySerialization işleminin avantajları olduğu gibi dezavantajları da vardır.Şimdi bu durumları anlayabilmek için oluşturacağımız senaryoyu ilerletelim. Program içinde kulandığımız data veya nesne’yi aktaracağımızı varsayalım. BilisimIOData adında bir sınıfımız olsun. Sınıfı serialize edip gönderdiğimizde  deserialize edilen ordamda BilisimIOData sınıfının olması zorunluluğu vardır. Öte yandan Binary mantık olarak elindeki objeyi veya datayı ondalik sisteme çevirip işlemektedir. Bu durum bize BinarySerialization işleminin Human Readable (bizim anlayabileceğimiz şekilde okunabilir veri) olmadığını göstermektedir ve düzenlenebilir bir data değildir. Binary olarak serialize edilmiş bir dosyayı açıp içinde bir değişiklik yapılırsa dosya bozulacaktır ve deserialize edilemeyecektir. BinarySerialization da her platformun nesne yapısı farklı olduğundan CrossPlatform  ( Farklı ortam )  desteği yoktur. Şimdi örneğimize geçelim. Projemiz içinde oluşturacağımız sınıf’ ı Binary serialize ve deserialize işlemine tabi tutalım.

 

Yeni bir ConsoleApplication oluşturuyoruz. Oluşturduğumuz proje içinde Serialization&Deserialization işleminde kullanılmak üzere Author.cs sınıfını ekliyoruz.

 

Sınıfları serialize edebilmek için [Serializable] attribute ‘ unu örnekte olduğu gibi eklememiz gerekmektedir. Bu eklemeyi yapmadığımız zaman derleyici hata vermeyecektir fakat program akışında hata almamız kaçınılmaz olur. Burada dikkat edilmesi gereken başka bir durum ise serialize olmasını istemediğimiz alanları [NonSerialized] olarak işaretlemektir.

BinaryFormatter serialization

Şimdi BinarySerialize adında bir sınıf ekleyip işlemleri yapacak olan methodları yazalım.Serialize & Deserialize işlemlerini Formatter yapısıyla sağlıyoruz. Formatter .net framework 1.1 ‘den beri bizimle olan bir yapı. Methodumuzu yazarken System.Runtime.Serialization.Formatters.Binary  BinaryFormatter sınıfından faydalanacağız. BinaryFormatter sınıfı serialize methodunu stream edilen data üzerinden sağlar. Bu nedenle stream objemiz ve serialize edilecek nesneyi methoda parametre olarak göndermeliyiz. Biz işlemimizi memory’de yaptğımız için burada MemoryStream kulanıyoruz. Farklı bir işlemde dosya ile ilgili bir işlem yapıyor olsaydık bu defa FileStream, StreamWriter ,StreamReader gibi sınıfları kullanabilirdik. Methodumuza dönecek olursak BinaryFormatter serialize işlemini tamamlayınca geriye byte dizi dönmektedir. Bizde geriye byte dizi dönen bir method tanımladık ve işlemlerimizi gerçekleştirdik. Deserialize işlemi de yine formatter yardımıyla gerçekleşir. Bu defa method parametre olarak byte dizi alır geriye ise object döndürür.

Program.cs içine methodları çağıran kod blogunu da ekleyelim.

 

 

Kodları inceleyecek olursak Author sınıfını kullanarak author isimli bir obje oluşturduk.  Author objemizi oluştururken Object İnitializers özelliğinde faydalandık. Bu durum IDE’nin bize sunduğu güzellikler arasındadır. VisualStudio  2008  ile birlikte yazdığımız kodlar arasında yer edinmiştir. İsterseniz aşağıdaki gibi de tanımlama yapabilirsiniz.

Convert.ToBase64String methodu byte dizi ‘yi olduğu gibi string ‘e çevirir.

Programı çalıştırıp sonuca baktığımızda author sınıfını serialize ve deserialize edilmiş olarak görebilirsiniz.

 

XML(Extensible Markup Language, Genişletilebilir İşaretleme Dili) Serialization

  • XML Serialization ile yapılan Serialize&Deserialize işlemlerinde tip güvenliği yoktur. Veriyi string olarak genel XML kurallarında işleyip döndürür. Serialization işlemlerinde XML ‘ in avantajı Cross Platform da ortaya çıkmaktadır.İşlem sonucumuz birden çok ortamda kullanılacaksa XML tercih sebebi olabilir. Serialize olmasını istemediğimiz bir değişkenimiz varsa bunları [XmlIgnore] ile işaretlememiz gerekmektedir. Serialize edilecek değişkenler [XmlElement] ile işaretlenir. Unutmadan eklemek gereken önemli bir durum ise Xml Serialize’ın private tanımlanmış değişkenleri serialize etmediğidir. Şimdi Örneğimizi biraz daha zengineştirip XMLSerialization sınıfımızı entegre edelim.

Projemize XMLSerialization adında yeni bir sınıf  ekleyelim ve methodlarımızı yazalım.
Xml için eklediğim Serialize methodunda  XmlSerializerNamespaces ile oluşturduğumuz xml ‘ i obje çeviri işlemine yakın hale getiriyoruz. Bu kodu kullanmadığımız zaman xmlns=”> was not expected.” hatası alırız.

Bizim örneğimiz nesne yi xml ‘e çevirip tekrardan nesne ‘ ye dönüşümünü sağlamak olduğundan bu xmlns ‘ e gerek duymuyoruz. Zorunlu olduğu senaryolarda XmlRoot attribute parametreleriyle istenilen yapıyı sağlayabiliriz. System.Xml ile gelen XmlWriter xml içeren  dosya  veya stream oluşturmak için kullanılır. Biz örneğimizi stream üzrinden kurduğumuz için oluşan stream’ i işleyebileceğimiz bir obje gerekiyor, bu obje StringWriter sınıfıdır. String işlemleri için kullanılan stream (akış , kanal) türüdür.

 

Daha önce eklediğimiz Author sınıfı üzerinde bazı değişiklikler yapmamız gerekecek. Yeni hali aşağıdak gibi olmalıdır.Author sınıfımız son haliyle birlikte hem binary hem Xml serialization’a uygun yapıya geldi.

Programı çalıştırıp sonuca baktığımızda author sınıfını serialize ve deserialize edilmiş olarak görebilirsiniz.

H.Burak Karadağ

 

 

 

 

Yorum yaz

Email adresiniz yayınlanmayacaktır.