C# Serialization ve DeSerialization

Serileştirme (Serialization), nesnelerin çalışma zamanındaki (runtime) durumlarını alıp geçici veya kalıcı olarak bir kaynağa (file,memory, database, socket, buffer vb.) saklamak/transfer etmek için belirli bir forma dönüştürülüp yazma işlemidir.

Ters-serileştirme (Deserialization), bir kaynakta (file,memory, database, socket, buffer vb.) bulunan serileştirilmiş (serialize) belirli bir formdaki nesnelerin, ihtiyaç olduğunda çalışma zamanındaki durumunu elde etme işlemidir.

Serilization                                                                    Deserialization

Serialization ve Deserialization


Serileştirmek veya ters-serileştirmek istediğimiz nesnenin içeriği Formatter’lar tarafından manipüle edilerek kullanılır, sonrasında ise serileştirme işlemi sırasında Formatter tarafından belirli bir forma dönüştürülen veri bir stream‘ e doğru yazılır yada ters-serileştirme işlemi yapılıyorsa stream’den okunan veri yine Formatter kullanılarak orjinal nesne üzerine yüklenir.

Stream üzerine yazılmış olan belirli bir formdaki serileştirilmiş nesne, sadece üzerindeki veriyi tutmakla kalmayıp nesne hakkındaki tip bilgisi, versiyonu, culture, assembly adı gibi bilgileride taşımaktadır.

Serileştirme sayesinde uygulama geliştirici

  • Nesneleri uzak (remote) bir uygulamaya gönderme (Web Servisi vb.),
  • Nesneleri bir domain’den diğerine gönderebilme,
  • Nesneleri firewall üzerinden XML olarak transfer edebilme, yada istenilen nesne bilgilerini uygulamalar arasında taşıyabilme

gibi işlemleri gerçekleştirebilmektedir.

İhtiyacınız olan bir nesneyi serileştirmek için; ilk önce nesnenin tipini serileştirebilir hale getirmeniz gerekmektedir, sonra nesneyi bir formatlayıcı sayesinde başka bir forma dönüştürerek bir stream’e yazarak serileştirilmiş olursunuz. Nesneleri serileştirmek için kullanabileceğiniz sınıflar System.Runtime.Serialization namespace’i içerisinde yer almaktadır.

Herhangi bir tipi SerializableAttribute etiketi ile işaretlendiğinizde yada MarshalByRefObject sınıfından türettiğinizde serileştirilebilir hale getirmiş olursunuz. Eğer SerializableAttribute etiketi ile işaretlenmemiş bir tipi serileştirilmeye çalışırsanız SerializationException hatası alırsınız.

Serileştirilebilir sınıfınızın içerisinde bir alanı serileştirmek istemiyorsanız NonSerializedAttribute etiketi ile işaretlemeniz gerekmektedir. Yine serileştirilebilir tipiniz bir pointer, bir handle yada bir ortama özel bir veri yapısı içeriyor ve bu tip ters-serileştirildiğinde farklı ortamda kullanılamayacak ise bu alanı serileştirilemez yapmanız gerekmektedir.

Eğer serileştirilmiş bir sınıf serileştirilebilir SerializableAttribute etiketi ile işaretlenmiş diğer referans sınıflar içeriyorsa o nesnelerde serileştirilir.

Serileştirme Türleri

.Net içerisinde serileştirme iki şekilde yapılabilmektedir :
.Net ile hazır gelen serileştiricileri kullarak serileştirme yapmak,
Özel (custom) kendi serileştirme sınıflarınızı oluşturararak serileştirme yapmak.

.Net ile hazır gelen serileştiriciler ve piyasada yaygın olarak kullanılan bir kaç serileştirici aşağıdaki gibidir :

Serileştirme Klavuzu

Yeni sınıflar tasarlarken serileştirme bakımından bazı hususları göz önünde bulundurup dikkat etmeniz gerekmektedir.

Örneğin ;

  • Tasarladığınız sınıf application domain’ler transfer edilecek mi?
  • Tasarladığınız sınıf remoting yada WCF ile birlikte kullanılacak mı?
  • Tasarladığınız sınıf nesnesi kalıcı olarak bir veri kaynağında saklanacak mı?
  • Tasarladığınız sınıf soyut bir sınıf ise bu sınıftan türeyen sınıflar serileştirilecek mi?

Eğer yukarıdaki sorulara net bir cevabınız var ise sınıflarınızı serileştirebilir yapabilirsiniz.
Ancak net bir yanıtınız yok ve aşağıdaki durumları yaşıyorsanız ;

  • Tasarladığınız sınıf hiç bir zaman farklı application domain’lerde kullanılmayacaksa,
  • Tasarladığınız sınıf instance sadece o anlık kullanılacak ise,
  • Tasarladığınız sınıf içerisindeki bazı alanlarda hassas bilgiler var ise

serileştirme kullanmanız sizin için gereksiz olacaktır.

Serileştirici seçiminde dikkat edilmesi gereken nokta, uygulamanızın iş modeline bağlı olarak serileştirilecek neslelerin içeriği ve serileştirme yöntemidir. Eğer yüksek boyutlu verileri içeren nesneler ile çalışıyorsanız XML serileştirme doğru bir seçim olmayacaktır çünkü verilerinizi XML formatına soktuğunuzda transfer edilecek boyut dahada artarak transfer hızını düşürecek ve performans kaybına sebep olacaktır. Ancak böyle bir durumda binary serileştirme yada özel (custom) serileştirici ile serileştirme yaptığınızda aradaki performans farkı gözle görülür bir biçimde artacaktır. Fakat iş modeliniz farklı platformlarda nesne transferi yapıyor ise interoperability bakımından SOAP yada XML serileştirme kulllanmanız sizin için uygun bir seçim olacaktır.

Kaynak ;

Serialization (C# and Visual Basic)

Bir cevap yazın