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
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.
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.
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 :
- Binary Serialization
- XML Serialization
- SOAP Serialization
- Custom Serialization
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 ;
Bir cevap yazın
Yorum yapabilmek için giriş yapmalısınız.