.NET Framework ‘teki tek “serialize edilebilen” nesne, elbetteki DataSet nesnesi değildir. Aslında bizim yazmış olduğumuz bir sınıf türündeki nesne de serialize edilebilir. .NET Framework Class Library ‘ de bir nesneye, XmlSerialization uygulamayı sağlayan XmlSerializer isimli bir sınıf bulunur. 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;
[Visual Basic]
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 prototipini verdiğim 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ı ile 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ğini kısaca incelersek, gözümüze ilk çarpan; sadece m_Urun, m_Musteri ve m_Adet isimli değişkenlerin içerdiği değerlerin dosya içerisinde bulunması, ancak mTarih 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.
Örnek : Herhangi bir sınıf türündeki nesne, nasıl ki XmlSerialization işlemine tabi tutuluyorsa, aynı şekilde bir DataSet nesnesine de XmlSerialization uygulanabilir. Aşağıdaki örnek uygulamada Northwind veri tabanındaki Employees tablosundan, EmployeeID alanındaki değeri 2 olan, kayıt, oDs nesnesi ile temsil edilen DataSet içerisindeki “CalisanlarTablosu” isimli tabloya aktarılmıştır. Daha sonra oDs nesnesi, oSer isimli nesne ile, XmlSerialization işlemine tabi tutulmuş ve içeriği “DS.xml” isimli dosyaya kaydedilmiştir.
Imports System.Data.SqlClient
Imports System.Data.Common
Imports System.Xml.Serialization
Imports System.IO
Module Module1
Sub Main()
Dim cnnStr As String
cnnStr = "initial Catalog=Northwind"
cnnStr &= ";Data Source=localhost;User id=sa"
Dim oDs As New DataSet("Calisanlar")
Dim oCnn As SqlConnection
oCnn = New SqlConnection(cnnStr)
oCnn.Open()
Dim oAdp As SqlDataAdapter = New SqlDataAdapter()
Dim sSql As String
sSql = "Select LastName, FirstName From Employees "
sSql &= "Where EmployeeID = 2"
oAdp.SelectCommand = New SqlCommand(sSql, oCnn)
oAdp.Fill(oDs, "Calisanlar Tablosu")
’XML Serialization işlemi
Dim oSer As XmlSerializer
oSer = New XmlSerializer(GetType(DataSet))
Dim oFile As FileStream
oFile = New FileStream("C:\\DS.xml", FileMode.CreateNew)
oSer.Serialize(oFile, oDs)
oFile.Close()
End Sub
End Module