Makale Özeti

Serialize; nesneyi kolayca ulaşılabilir bir forma çevirme işlemidir. Serialization ise nesnenin kopyalarını kullanarak onları serialize etmektir.

Makale

BinarySerialization

Serialization (Dönüştürme)

Serialize; nesneyi kolayca ulaşılabilir bir forma çevirme işlemidir. Serialization ise nesnenin kopyalarını kullanarak onları serialize etmektir. Daha sonra o nesneye ihtiyaç duyduğumuzda , nesnenin serialize edilmiş halini deserialization yöntemi ile başka bir nesneye atayarak kullanırız. Serialization işlemini uygulamak için farklı yöntemler kullanılır. Bu yöntemlerin her birine format denir. Bazı format çeşitleri Xml,Soap,Binary. Format çeşitlerinde genel olarak; serialize edilmiş nesnenin bir kopyası, serialize edildiği yerde, belirtilen formattadır. Gerektiğinde orjinal halinin aynısı şeklinde oluşturulur. Kısaca dönüşüm sayesinde nesnelerin ömürleri uygulamanın ömrüne bağlı olmaktan çıkar.  

Program akışı içinde nesnenin değerini normal yerinin haricinde biryerde saklamamız gerekebilir. Bu gibi durumlarda kullandığımız sınıfa Serializable özelliğini ekleyerek serialization yöntemini kolaylıkla kullanabiliriz. Serialize formatını seçeriz. Böylece seçtiğimiz formatta o nesneyi istediğimiz yere serialize etmek suretiyle kaydetmiş oluruz. Eğer kontrol kullanmadan nesne üzerinde herhangi bir değişiklik yapmak istersek, nesnenin referansını kullanarak serialization yoluyla istediğimiz işlemleri gerçekleştiririz.  

Serialization , nesnelerin durumlarını korumak için kullanılan yöntemlerden biridir. Genellikle, ağ iletişiminde , bilgiyi bir makinadan diğerine göndermede  kullanılır. Örneğin kullanılan bir uygulama sonlandığında bu uygulama içerisinde serialize yapılmış olan nesneler , ağ üzerinden başka bir makinaya gönderilerek kullanılmaya devam ettirilebilir.

Şimdi Serialization formatlarından biri olan BinarySerialization’a bakalım.

BinarySerialization

Binary Serialization  nesnenin binary dosyaları şeklinde tutulmasını sağlar. Nesne üzerindeki işlemleri yine bu binary dosyalarını kullanarak yaparız.  

BinarySerialization’un bazı özelliklerine şöyledir:  

  • Serialization işlemi sırasında baştan başa bir Xml dosyası olusturulmadığı için, Xml formatına göre daha hızlı bir serialiazition formatıdır.
  • Sonuç olarak uretilen ikili bilgiler Xml stringlerinden  daha fazla uyumludur. Daha az yer kaplarlar .Daha sonra istenilen nesneye çevrimleri daha hızlı olur.
  • ISerializable arayüzünü destekleyen tüm kontroller ve SerializableAttribute özelliği işaretli olan nesneler serialization özelligini desteklerler.
  • BinarySerialization yönteminde public değişken ve yöntemlerin yanı sıra, private değişken ve yöntemleri de serialize edebiliriz. Bu şekilde olan serialize yöntemine deep serialization denir. (Xml formatında sadece public yöntem ve değişkenler serialize edilebilir. )
  • Sınıf ve koleksiyonlardaki bilgileri saklamada BinarySerialization yöntemi Dataset kullanımından daha verimlidir. Verilerin olduğu yerden bilgi almak gerektiğinde Dataset kullanılırsa verilere ulaşmak için daha uzun süre harcanır. Bu süre bilginin veri tabanından alınması ve kullanıcı tarafinda bu  bilginin yorumlanmasını kapsamaktadır.  

Bu faydalı özelliklerinin yanında BinarySerialization formatının bazı olumsuz tarafları vardır: 

  • BinarySerialization işlemi uygulanacak sınıfın veya nesnenin  SerializableAttribute özelliği belirtilmek zorundadır. Hangi nesneyi serialize etmek istiyorsak önüne <Serializable()> ön ekini yazmamız yeterlidir.  

      Serializable()> Public/Private  NesneIsmi .  

Serialize edilecek sınıfın içindeki herhangi bir nesnenin serialization işlemine tabi tutalmasını istemeyebiliriz.Bu gibi bir durumda nesnenin önüne <NonSerialized()> ön eki getiririz. Mesela aşağıdaki örnekte ders kredisini göstermek için kullanılan ve public olan DersKredisi değişkenini serialize etmek istemediğimizde  DersKredisi nesnesini ‘<NonSerialized()> Public DersKredisi As String’  şeklinde tanımlarız.

  • BinarySerialization formatı ikili kod yapısında olduğundan ,dosyanın içini açtığımızda kolaylıkla okunabilecek bir yapıda olmadığı göreceğiz. BinarySerialization sonucunda elimizde olan çıktıyı deserialization işlemine yapmadan, üzerinde işlem yapmak  oldukça zordur.

Şekil-1: Oluşan dosyanın içeriği.  

Örnek Uygulama: BinarySerialization formatınını kullanmak için bir Windows Application uygulaması açalım. Uygulamada kullanıcının girdiği bilgileri BinarySerialization formatında saklayarak, sonra deserialization işlemi ile kullanıcı girişlerini geri elde edeceğiz.

Kullanacağımız Ders isimli sınıfı  oluşturalım . Sınıfta public değişken kullanacağımız gibi private değişkende kullanacağız.

 <Serializable()> Public Class Ders
    <Serializable()> ifadesi ile Ders sınıfına serialize edilebilir özelliği kazandırıyoruz.
    Public DersAdi As String
    <NonSerialized()> Public DersKredisi As String
    public bir değisken olsa bile DersKredisi degiskeninin serialize özelligini <NonSerialized()> ifadesini ekleyerek iptal ediyoruz.
    Private DersDonemi As String
    Property adi()
        Get
            Return DersAdi
        End Get

        Set(ByVal Value)
            DersAdi = Value
        End Set
    End Property

    Property kredisi()
        Get
            Return DersKredisi
        End Get

        Set(ByVal Value)
            DersKredisi = Value
        End Set
    End Property

    Property donemi()
        Get
            Return DersDonemi
        End Get

        Set(ByVal Value)
            DersDonemi = Value
        End Set
    End Property

End Class  

Şimdi de formumuzu tasarlayalım . Forma kullanıcı girişi için üç tane text kontrolü ve biri serialize işlemi diğeri deserialize işlemi için iki tane button kontrolü , bir de arka tarafta oluşan olayları takip edebilmek için txtDurum isimli text kutusu yerleştiriyoruz.

 

Şekil-2: Form Tasarımı. 

Imports BinarySerialization.Ders
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

serialize formatların biri olan BinarySerializationa ulaşmak için binary isimuzayını import ediyoruz.  

Public Class study  

    Public Sub yaz(ByVal katar As String)
        txtDurum.Text &= katar.ToString & vbNewLine
    End Sub

    Public Function atama() As Ders
        kullanıcı girişlerini Ders sınıfından turettiğimiz nesneye atıyoruz.
        Dim BirDers As New Ders
        BirDers.adi = txtAdi.Text
        BirDers.kredisi = txtKredisi.Text
        BirDers.donemi = txtDonemi.Text
        Return BirDers
    End Function  

    Public Sub Serialize(ByVal kayit As Ders)

        serialization() fonksiyonu ile kullanıcının girdigi bilgileri Binary seklinde serialize edeceğiz.
        burada Ders nesnesini System.Runtime.Serialization.Formatters.Binary namespace’indeki BinaryFormatter sınıfını kullanarak MemoryStream cinsinden türettiğimiz  store nesnesinin içine serialize ettik.

        Try
            Dim store As New MemoryStream
            Dim dosya As FileStream
            dosya yeni oluşturuluyor.

            dosya = New FileStream("c:\DersKayit.dat", FileMode.Create, FileAccess.Write)
           Dim binaryFormati As New BinaryFormatter
            memory stream nesnesi olan store nesnesine serialization olayı gerçekleşiyor.
            binaryFormati.Serialize(store, kayit)
            fileStream olarak turettiğimiz DersKayit dosyasına  yazılıyor.
            binaryFormati.Serialize(dosya, kayit)
            txtDurum.Text = ""
            yaz("serialization gerceklesti.")
            dosya.Close()
            dosyayi kapatıyoruz.

        Catch uyari As Exception
            yaz(uyari.Message & " hatasi olustu")
        End Try

    End Sub

 

    Public Sub Deserialize()

        Try
            Dim okuDers As New Ders
            Dim dosyaOku As FileStream
            Dim binaryFormati As New BinaryFormatter
            dosyaOku = New FileStream("c:\DersKayit.dat", FileMode.Open)
            okunacak olan dosya açılıyor
            daha önce olusturduğumuz dosyanın adresini vererek açıyoruz.
            okuDers = CType(binaryFormati.Deserialize(dosyaOku), Ders)
            serialize edilmis dosya deserialize edilerek Ders sınıfı türüne çevriliyor.
            txtDurum.Text = ""
            ve binary seklindeki bilgileri kullanılabilir biçimde elde ediyoruz.
            yaz(okuDers.adi)
            yaz(okuDers.donemi)
            yaz(okuDers.kredisi)
            yaz("deserialize islemi tamamlandi")
           dosyaOku.Close()

        Catch uyari As Exception
            yaz(uyari.Message & " hatasi oldu")
        End Try

    End Sub

    Private Sub btnSerialization_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSerialization.Click
        Serialize(atama())
    End Sub

    Private Sub btnDeserialization_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeserialization.Click
        Deserialize()
    End Sub

 End Class

Yapmış olduğumuz örnekte oluşan dosya C:\DersKayit.dat olarak kaydedilmiştir. Bu dosya nesne için ikinci bir kayıt yeri görevi görür. Programın istediğimiz yerinde  tekrar deseriazliation işlemine tabi tutarak  buradaki bilgileri elde edebiliriz.

 Programı çalıştırıp Adı: matematik, Dönemi: 2, Kredisi:3 diye giriş yaptıktan sonra serialization butonuna basalım. Bu işlem sonunda bilgiler DersKayit.dat dosyasına yerleşmiş olur. Tekrar elde etmek için  deserialization butonuna bastığımızda Dosyanın içeriğini görmüş oluruz.

 

Şekil-3 : Deserialization işlemi sonrası ekran görüntüsü.

 Görüldüğü gibi DersKredisi değişkeni <NonSerialized()> özelliğine sahip olduğu için içerdiği bilgiyi geri elde edemedik. Ders sınıfının diğer değişkenlerinin değerleri elde edilmiştir.

 Yorumlarınızı bekliyorum .

 

Öznur KARAKUŞOĞLU
oznurkarakusoglu@hotmail.com