Murat Tüfekçi

Bilinmeyen SerializationSubscribe Subscribe

  • Murat Tüfekçi
  • September 16th, 2008

Bilinmeyen fakat bazen çok yararlı olacağını düşündüğüm ve sizinle paylaşmak istediğim Serialization hakkında bir kaç yararlı ip uçu vereceğim. Ve web uygulaması veya windows uygulaması olsun cok yararlı olabileceğine eminim ve bu konuya birazda olsa açıklık getireceğim.

Direk konuya girerekten açıklamaya çalışacağım. Bir turizm projesi üzerinde çalıştığım için direk kendi projemden örnek vererek başlıyacağım. Otel rezervasyonu yaparken rezervasyon adında bir sınıf yaratıp bu sınıfın üyelerini gerekli bilgilerle doldurup rezervasyon sonunda bu sınıfı kullanarak kolayca bilgilerimi veritabanına kaydetmek gibi cok kullanışlı ve kolay bir yol izlemek istedim. Fakat herzaman ki gibi kolay olarak görünen bu olay bazı yerlerinde biraz sorun yarattı. Esas sorun bu sınıfı sayfalar ve post ları arasında taşımaktı. Ama taşıma işlemi kendi içinde de ikiye ayrıldı. Birincisi bu bilgiyi sayfalar arasında ikiniciside bir sayfa içindeki birden fazla post olaylarındaydı. Sayfalar arasında bu sınıfı taşımam zaten bildiğim bir konuydu Session nesnesin de sınıflarımızı direk atayıp sonra basit bir tip dönüşümü ile alabiliyorduk,

Session["Sinifim"]=new Sinifim(); // Siniftan Atama
Sinifim sf= (Sinifim)Session["Sinifim"]; // Session Objesinde Atama

örnekte belirttiğim gibi bu işlem zaten bilindik bir durumdu fakat ben bu sınıfı sayfanın kendi postları içinde aynı şekilde taşıyabilirdim ama session nesnesini kullanmak bazen performans sorunlarına neden olduğu bildiğim bir durumdu. Bu performans durumdan sayfalar arasındaki geçişlerde vazgeçebilirdim ama sayfanın kendi postları içerinde yogun biçimde sunucu taraflı kodlar olduğu için tutmak istemiyordum. Bu yüzdende sayfaya özel olarak tutalan viewstate i araştırmaya başladım. ViewState bildiğiniz üzere sayfadaki kontrollerin sayfa postları sırasında değerlerini kaybetmemesini sağlamaktır. Mantık olarak bu kontroller için kullanılıyorsa, benim yarattığım bir sınıf içinde kullanılabilmeliydi. Araştırmalarım sonucu Serialization konusunun can alıcı kullanışlılıkta bir konu oluğunu öğrendim ve uyguladım. Örnek olarak elinizde bir sınıf var ve bu sınıfı tuttuğu değerlerle bir dosyada saklamak istiyorsunuz. Eger bu sınıfı Serialization ile isaretlerseniz bu mumkün olacak ve dosya içinde binary olarak saklayabileceksiniz. ViewState içinde veri saklamanın aslında dosyanın içinde veri saklamak gibi çalıştığından pek farkı yoktur.Bu yüzden eğer bir sınıfı ViewState içerisinde saklamak istiyorsanız o sınıfı Serialization ile işaretlemeniz gerekmektedir. İşin özü bu. Örnek olarak,

[Serializable]
public class Oda{}

şeklinde tanımlanmış bir sınıfı viewstate e veya bir dosyaya sorunsuz kaydedebilirsiniz.

Başka bir durumda bazen sınıfın barındırdığı bazı değerlerin viewstate de fazla yer tutmaması için saklamak istemeyebilirsiniz. Örnek olarak DataTable tipine olan bir nesneniz içerisinde çok büyük bilgi tutabilir ki bu bilgiyi viewstate’e kaydetmek mantık açısından yanlış olurdu. Düşünsenize 50 KB lik binary veri saklayan bir hidden input u sunucuya post etmek:) . Herneyse bu tanıma uyan bir durumla karşılaşırsanız yapmanız gerek şu,

[NonSerialized]
public DataTable CocukUrunTablo;
diyerekten bu değerin saklanmasını engelleyebilirsiniz diyorum ve bu konuyuda burda kapatiyorum.

Sorularınızı cevaplamaktan mutluluk duyacağımdan email ve yorumlarınızı bekliyorum.

 





Leave a Comment

Required
Required (Won't be published)
Optional
Avatar
Add your picture!
Join Gravatar and upload your avatar. It's free!