Makale Özeti

Bu makalede .NET Framework ‘ün anahtar özelliklerinden birisi olan Serialization kavramı incelenmekte ve Xml Serialization yöntemi açıklanmaktadır.

Makale

XML Serialization

XML Serialization

      .NET terminolojisinde serialization; bir nesneye ait veri içeriğinin (durum bilgisinin), dosya ya da veri tabanı gibi herhangi bir veri depolama aygıtı üzerine kaydedilmesi işlemine verilen isimdir. Bu bağlamda serialization ve persistence kelimeleri literatürde eş anlamlı olarak kullanılmaktadır.


NOT : Bilindiği gibi herhangi bir nesne, diğer nesnelerden ayırt edilebilmesini sağlayan üç adet karakteristiğe sahiptir, bunlar;

  1. Identity (Kimlik)
  2. Behavior (Davranış)
  3. State (Durum Bilgisi)

       Bu karakteristik özelliklerden üçüncüsü yani durum bilgisi söz konusu nesneye ait veri elemanlarının taşıdığı değerleri ifade eder.


       Serialization, .NET Framework ‘ün anahtar özelliklerinden birisidir ve CLR tarafından gerçekleştirilen bir çok işlemde implicit olarak kullanılmaktadır. Örneğin tüm exception nesneleri, “serialize edilebilen” (serializable) nesneler olarak tasarlanmışlardır.

       Serialization, geri döndürülebilir bir işlemdir. Yani serialization işlemine tabi tutulan bir nesnenin durum bilgisi, kaydedildiği yerden söz konusu nesnenin ilgili alanlarına geri yüklenebilir. Bu işlem ise, terminolojide deserialization olarak anılmaktadır.

       Serialization ve Deserialization işlemlerini gerçekleştirmenin birden fazla, farklı yöntemi vardır. Örneğin "Binary Serialization" ya da "SOAP Serialization" gibi. Ancak hangi yöntem kullanılıyor olursa olsun, tüm serialization işlemleri uygun Formatter nesneleri aracılığı ile gerçekleştirilir. Formatter nesneleri, serialization işleminin nasıl yapıldığını belirlemeye yarayan nesnelerdir. Örneğin .NET Framework Class Library içerisinde bulunan “Binary Formatter” ve “SOAP Formatter” nesnelerinde olduğu gibi. Tüm Formatter nesneleri IFormatter arayüzünden implementasyon yolu ile kalıtım sağlamaktadır. Programcılar bu arayüzü implemente eden özgün Formatter sınıflarını da tasarlayabilirler.

        XmlSerialization ise, bir nesnenin herhangi bir t anındaki durum bilgisini (sadece public veri elemanlarının taşıdığı değerleri) xml formatında kaydetmeyi, ya da tam tersine bir xml stream ‘deki verileri, bellekteki söz konusu nesnenin ilgili alanlarına geri yüklemeye imkan tanır.

Xml Serialization Yönteminin Temel Özellik Ve Kısıtlamaları

  • XmlSerialization sadece Public anahtar sözcüğü ile bildirimi yapılmış olan sınıflara uygulanabilir.
  • Sınıfın sadece Public veri elemanları XMLSerialization işlemine tabi tutulabilir.
  • Döngüsel referans ‘lar içeren nesne grafiklerine XMLSerialization işlemi uygulanamaz.
  • Kendisi türünde tanımlanacak olan nesnelere, XML Serialization işlemi uygulanmak istenen bir sınıf, default constructor içermek zorundadır.

Xml Serialization Yönteminin Uygulanması
Ve XmlSerializer Sınıfı

       XmlSerializer sınıfı; System.Xml.Serialization namespace ‘inin bir üyesidir. XmlSerializer sınıfı türünde tanımlanan bir nesnenin üyeleri kullanılarak, serialization ve deserialization işlemleri gerçekleştirilebilir.

XmlSerializer Sınıfının Üyeleri

       XmlSerializer sınıfı türünde tanımlanan bir nesnenin türetilmesi amacı ile, bu sınıfın overload constructor metotlarından herhangi birisi kullanılabilir. Aşağıda prototipi verilen versiyon, pratikte en sık kullanılan versiyondur;

Public Sub New(ByVal type as Type)

       Bu metoda XmlSerialization uygulanmak istenen nesnenin türü parametre olarak geçirilir. Örneğin CDeneme isimli sınıf türündeki nesnelere XmlSerialization uygulanmak isteniyorsa;

Dim oSer As XmlSerializer
oSer = new XmlSerializer(GetType(CDeneme))

XmlSerialization sınıfının, serialization işlemini gerçekleştirmekten sorumlu olan üyesi; Serialize() metodudur. Serialize() metodu overload tasarlanmış bir metottur ve birden fazla farklı parametrik yapıya sahip versiyonu vardır. Aşağıda prototipi verilmiş olan Serialize() metodu; ikinci parametresine geçirilen nesneyi serialize eder ve bu nesnenin public veri elemanlarındaki değerleri, ikinci parametresine geçirilen Stream sınıfı türündeki nesne ile temsil edilen xml stream ‘e yazdırır.

Public Sub Serialize(ByVal stream as Stream, ByVal o as Object)

Örnek : Aşağıdaki konsol uygulamasında, Siparis sınıfı türündeki oSiparis nesnesinin public veri elemanlarındaki değerler, oSer nesnesinin Serialize() metodu kullanılarak “Siparis.xml” isimli dosyaya yazdırılmıştır.

Imports System.Xml.Serialization
Imports System.IO

Public Class Siparis

    Public m_Urun As String
   
Public m_Musteri As String
    Public m_Adet As Integer
    Private m_Tarih As Date

    Public Sub New()

    End Sub

    Public Sub New(ByVal pMusteri As String, _

    ByVal pUrun As String, ByVal pAdet As Integer)

        m_Musteri = pMusteri
        m_Urun = pUrun
        m_Adet = pAdet

    End Sub

    Public Sub TarihVer()

        m_Tarih = Now()

    End Sub

End Class

Module Module1
    Public Sub main()

        Dim oSiparis As Siparis
        oSiparis = New Siparis("Emre EROGLU", "Klima", 1)
        Dim oSer As New XmlSerializer(GetType(Siparis))
        Dim oFile As FileStream

  oFile = New FileStream("C:\Siparis.xml", FileMode.CreateNew)
        oSer.Serialize(oFile, oSiparis)
 
       oFile.Close()

   End Sub
End Module

Bu örneğin çalıştırılması sonucunda elde edilen “Siparis.xml” dosyasının içeriği şöyle olacaktır;

<?xml version="1.0"?>

<Siparis xmlns:xsd="http://www.w3.org/2001/XMLSchema" _
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<m_Urun>Klima</m_Urun>

<m_Musteri>Emre EROGLU</m_Musteri>

<m_Adet>1</m_Adet>

</Siparis>

       “Siparis.xml” dosyasının içeriği incelendiğinde, dikkat edilmesi gereken nokta; sadece m_Urun, m_Musteri ve m_Adet isimli değişkenlerin içerdiği değerlerin dosya içerisinde bulunması, ancak m_Tarih isimli değişkenin taşıdığı değerin bulunmamasıdır. Bu durum, m_Tarih isimli değişkenin private anahtar sözcüğü ile tanımlanmış olmasından kaynaklanmaktadır.

        XmlSerialization sınıfının deserialization işlemini gerçekleştirmekten sorumlu olan üyesi ise; Deserialize() metodudur. Deserialize() metodu da overload tasarlanmış bir metottur ve birden fazla farklı parametrik yapıya sahip versiyonu vardır. Aşağıda prototipini verdiğim Deserialize() metodu; parametresine geçirilen Stream sınıfı türündeki nesnenin temsil ettiği xml stream ‘indeki verileri içeren, Object sınıfı türünde bir nesne referansı döndürür. Bu fonksiyondan dönen referans kullanılarak, herhangi bir sınıf türünde tanımlanmış nesnenin türetilmesi sağlanır.

Public Function Deserialize(ByVal stream as Stream) as Object

Örnek : Aşağıdaki konsol uygulamasında, önceki örnekte yarattığımız “Siparis.xml” dosyasındaki verilerin oSiparis isimli nesnenin ilgili alanlarına aktarılması (deserialization işlemi) sağlanmıştır. Daha sonra oSiparis isimli nesnenin söz konusu alanlarındaki değerler konsol ekranına yazdırılmıştır.

Imports System.Xml.Serialization
Imports System.IO

Public Class Siparis

    Public m_Urun As String
 
   Public m_Musteri As String
    Public m_Adet As Integer
    Private m_Tarih As Date

    Public Sub New()

    End Sub

    Public Sub New(ByVal pMusteri As String, _
    ByVal pUrun As String, ByVal pAdet As Integer)

        m_Musteri = pMusteri
        m_Urun = pUrun
        m_Adet = pAdet

    End Sub

    Public Sub TarihVer()

        m_Tarih = Now()

    End Sub

End Class

Module Module1
    Public Sub main()

        Dim oSer As New XmlSerializer(GetType(Siparis))
        Dim oFile As FileStream 
     
  oFile = New FileStream("C:\Siparis.xml", FileMode.Open)
        Dim oSiparis As Siparis = oSer.Deserialize(oFile)
        Dim s As String
        s = "m_Urun = " & oSiparis.m_Urun & vbNewLine
        s &= "m_Musteri = " & oSiparis.m_Musteri & vbNewLine
        s &= "m_Adet = " & oSiparis.m_Adet
        Console.WriteLine(Temp)
        oFile.Close()

    End Sub
End Module

       Örnekte oSer nesnesinin Deserialize() metodu kullanılarak, oFile isimli nesne ile temsil edilen stream ‘deki verilerin, oSiparis isimli nesnenin ilgili veri alanlarına aktarılması sağlanmıştır. Bu örneğin çalıştırılması sonucunda elde edilen ekran çıktısı şöyledir;

Sonuç : Bu makalede Serialization konusuna genel bir giriş yapılmış olup, serialization yöntemlerinden birisi olan, Xml Serialization işlemi açıklanmış ve örneklenmiştir. Binary ve SOAP Serialization gibi diğer ilişkili konular ise, ileriki makalelerde ele alınmak üzere kapsam dışı tutulmuştur.


Aykut TAŞDELEN

aykutt@csdos.org