XML Serialization ve Deserialization

Yine bilindik cümlelerimle giriş yapmak yerine bu sefer direk konuya giriyorum. 🙂 Bu yazıda Serialization’ ın ne olduğunu, nerelerde kullanılabileceğini ve XML ile bunun nasıl yapılabileceğini anlatmaya çalışacağım.

Serialization Nedir?

Serialization ya da serileştirme diyebileceğim kavram dil bağımsız olarak düşünülmesi gerekir. Genellikle veri saklama ve veri taşıma gibi işlemlerde kullanılan serileştirme; bir veri yapısının veya bir nesnenin o anki durumunu daha sonradan kaynak olan veri yapısı veya objeye dönüştürülebilecek şekilde saklanması işlemine denir. Bazı yerlerde serileştirme olarak değilde Marshalling olarak ta duyabilirsiniz. Ne kadar karmaşık oldu dimi… Basitleştirmek için aşağıdaki grafiği hazırladım.

Serialization

Bir tane Person isminde sınıfımız olsun. Bunu sınıftan oluşturulmuş bir tane nesneyi bir yerde kaydedelim. Kaydetmeden önce nesnemizi değerleriyle birlikte tekrar geri dönüştürülebilecek formatta kaydedebilmek için XML Serialization kullanıyoruz. Kaydettiğimiz dosyayı tekrar sınıfımıza yüklemek için ise XML Deserialization kullanıyoruz. Burada gözden kaçmaması gereken nokta bizim sadece veriyle ilgili işlem yapıyor olmamız.

Nerede kullanılır?

İlk düşündüğünüzde aklınıza gelmeyebilir ancak kullanım yerlerini dört maddede sınıflandırabiliriz.

  • Objelerin kaydedilmesi
  • Uzak Yordam Çağrıları
  • Objeleri dağıtılması
  • Zamana bağlı olarak objeler üzerindeki değişikliklerin tespit edilmesi

Bu noktaları düşünerek aşağıdaki örneklerimizi inceleyelim.

Üniversitelerin çoğunda verilen programlamaya giriş derslerinde yapılan telefon defteri ya da adres defteri uygulamaları vardır. Eğitmen sizden, uygulama her açıldığında uygulama bilgilerini bir yerden okumanızı ve uygulama kapatılırken bu bilgilerin bir yerde saklanmasını ister. Size öğretilen şeylerden biri dosya açma, kapatma, sonuna kadar satır satır okuma şeklindedir. Bu bilginizi kullanarak veri alanlarını aralarında noktalı virgül (;), virgül (,), pipe (|) vb. gibi işaretlerle ayırarak kaydedersiniz. Hatta her bir satırda bir tane kayıt olacak şekilde bunu yaparsınız. Size bir bilgi vereyim, bu yaptığınız da aslında bir serialization yöntemi 🙂 . Adına Comma Separated Value (CSV) deniyor.

Başka örnek vermek gerekirse; yazılım geliştirmesi yapıyorken aslında çoğu zaman kullandığımı web servislerde bize çaktırmadan serialization kullandırtıyor. Nasıl mı? Şöyle; bir web servisi kullanmak için belirli kurallara bağlı istekler yapmanız gerekir ve servis size yaptığınız işlemin geçerli olması durumunda sabit bir formatta bir veri döneceğini söyler ya da döner. Buradaki verinin sabit bir formatta olması sizin bu veriyi geliştirdiğiniz uygulamada nasıl kullanacağınızı sizin planlamanızı sağlar. Hatta Visual Studio da geliştirdiğiniz projelerinizde (diğer kod geliştirme ortamları da sağlıyordur) Add WebReference – Add ServiceReference diyerek servisin size döneceğini söylediği sabit formata ait bir sınıf oluşturmasını sağlayabilir ve bazı dönüşümlerin sizin yerinize yapılmasını sağlayabilirsiniz.

Verdiğim örnekler tamamen günün içinden örnekler ve sayılarını arttırmak çok kolay. Ancak ben yeni bölüme geçmeden önce bir örnek daha vermek istiyorum ve sonrasında XML serialization’ ın C# tarafında nasıl yapıldığını inceliyor olacağız.

Örneğimiz için evimizdeki mutfağı kullanacağız ve biraz hayal gücümüzü çalıştıracağız. Sabah kalkıyorsunuz ve kahvaltıyı hazırlamak için dolabı açıyorsunuz. Bakıyorsunuz hiç bir şey yok, dolap bomboş. Aklınıza hemen bir liste yapmak geliyor. Listeyi yapıyorsunuz (süt, ekmek, peynir, zeytin ve yumurta). Bu listeyi alarak evden çıkıyorsunuz, markette listenizde olan ürünleri alıyorsunuz ve eve gelip bunları dolaba yerleştiriyorsunuz. Bana sorarsanız aslında bir serializtion işlemi yapıyorsunuz 🙂 . Serileştirmek için kullandığınız dosya, başka türlü söylemek gerekirse, verilerinizi sakladığınız yer not kağıdınız. Uygulamanız buzdolabınız, web servisiniz market ve arada verinin taşınmasını sağlayan sizsiniz. 😀 Biraz komik gibi gelebilir ama dikkatli bakarsanız bu tarzda bir kaç örnek daha bulabilirsiniz. 😉

C# ile XML Serialization

Şimdi gelelim bu serileştirme işlemi C# ile nasıl oluyor ve bir sınıfı nasıl XML formatına dönüştürüyoruz.

Yukarıdaki tanımlarda ve örneklerde de görebileceğiniz gibi ilk olarak sabit bir format belirlememiz gerekiyor. Bu formatı yazının başındaki görselde tanımladığımız sınıf üzerinde yapıyor olacağım. Sınıfımızın C# tarafındaki kodu şu şekilde olsun.

Bu sınıfın serileştirme işlemini yapabilmemiz için ilk olarak bir XML Serializer tanımlamamız gerekiyor (bu örneği memory üzerinde yapacağımdan direk bir dosyaya kaydetme işlemi bulunmuyor). Bu serializer’ a hangi tipde bir nesne yollayacağımızı söyleyerek ilklemesini yapıyoruz. Daha sonrada serileştirmek istediğimiz nesneyi veriyor. Serializer bize istediğimiz Stream içersine XML bilgisini yazıyor. Kullandığımız Stream MemoryStream olduğundan byte dizisi olarak bize geliyor. Bizde bunu string olarak dönüştürüyoruz ve istediğimizi elde ediyoruz.

yukarıdaki örnekte göreceğiniz şekilde serileştirme işlemini yapıyoruz ve bize serializer’ ımız aşağıdaki çıktıyı veriyor (xmlData içindeki değer).

Peki bize XML olarak geldiğinde bu nesnemizi nasıl dolduracağız? Onun cevabı da hazır. 🙂

görüldüğü gibi çok fazla işlem yapmamıza gerek kalmıyor ve hızlıca işlemlerimizi yapabiliyoruz. Dikkat edeceğiniz bir nokta verilerin tipleri ile ilgili bir işlem yapma ihtiyacımız olmadığı. Eğer verileri alacağınız yerler veya servisler de bu özelliğe sahip ise çok hızlı olarak uygulamanıza entegre edebilirsiniz.

Bu yazıyı da böylece tamamlamış olalım, ilerleyen günlerde biraz daha detaylı olarak bir şeyler eklemeye çalışacağım. O zamana kadar sizlerde etrafınızda olup biten değişik serileştirme ve geri serileştirme işlemlerini görmeye çalışın. 🙂

This article has 2 comments

  1. mehmetcanyilmaz

    Serialization ve deserialization’ın kod dışındaki kullanımına bir örnek de ben vereyim. CSV aynı zamanda kontaktlarımızın depolandığı en yaygın formatlardan biridir. Yahoo, Gmail, Linkedin vb. kontakt depolayan uygulamalardan kontaktlarımızın listesini indirmek istediğimiz zaman (ki Gmail androidli telefonlarda telefon defterinizi komple yedeklemiş olur) genelde bize CSV formatında gönderirler (VCF de gönderebilirler). Bu CSV’leri MS Excel vb. bir programla virgüllerden ayırabiliriz*. Yani virgüllerden ayırıp “comma separated” olmaktan kurtarabiliriz. Bu da CSV’nin bir başka kullanımı (*Veri > Metni Sütunlara Dönüştür). Benim gibi kodlamaya uzak olanlar için de bu ek bilgi iyi gider. Eline sağlık Fatih. 🙂

  2. Pingback: XML Serialization Püf Noktaları | Fatih Tatoğlu

Yorumlayın