Makale Özeti

Bu yazımızda XML serialization ile ilgileneceğiz, XML Serialization kullanarak çok az sayıdaki datayı Veritabanı kullanmadan nasıl saklayabileceğimizi göreceğiz.

Makale

Veritabanı yerine XML!

Merhabalar Arkadaşlar, Özellikle .Net ile birlikte gelen yeni özelliklerden bir tane serialization işlemi, eminimki daha önceden mutlaka bir yerlerde duymuşsunuzdur okumuşsunuzdur, belkide biliyorsunuzdur ancak ben bu yazımda seriileştirme işlemini ufak bir tabloda nasıl kullanabileceğiniz üstünde duracağım. Yani çok az bir veriniz varsa bu veriyi bir Veritabanı sistemi yerine direk serialization kullanarak saklamanın yöntemini anlatacağım. Hızlıca başlayalım hemen yeni bir Windows Uygulaması açın, ismine de Serialize yazın. Oluşan formun üst tarafına 4 tane button, alt tarafına ise bir adet DataGrid yerleştirin ve butonların isimlerini aşağıdaki resime göre düzenleyin.

Şimdi aslında ilk yapacağımız iş bu DataGrid de görüntülenecek olan basit şekildeki DataSet i oluşturmak, Dataseti bir kere oluşturduktan sonra aslında bir daha bu buton a gerek kalmıyor. Data Set butonua iki kere tıklatın ve açılacak olan bölüme şu kodları yazın.

 

    Dim dt As DataTable

    Private Sub Button1_Click(ByVal sender As System.Object,_

    ByVal e As System.EventArgs) Handles Button1.Click

        dt = New DataTable("Kullanici")

        Dim dc(2) As DataColumn

        dc(0) = New DataColumn("KullaniciId")

        dc(0).DataType = System.Type.GetType("System.Int16")

        dc(0).AutoIncrement = True

        dc(0).AutoIncrementSeed = 1

        dc(0).AutoIncrementStep = 1

 

        dc(1) = New DataColumn("AdiVeSoyadi")

        dc(1).DataType = System.Type.GetType("System.String")

 

        dc(2) = New DataColumn("Yasi")

        dc(2).DataType = System.Type.GetType("System.Int16")

        dc(2).DefaultValue = 0

 

        dt.Columns.AddRange(dc)

 

        Dim dr1 As DataRow

        dr1 = dt.NewRow

        dr1(1) = "Cenk Caglar"

        dr1(2) = 25

 

        Dim dr2 As DataRow

        dr2 = dt.NewRow

        dr2(1) = "Atakan Kesler"

        dr2(2) = 27

 

        dt.Rows.Add(dr1)

        dt.Rows.Add(dr2)

        DataGrid1.DataSource = dt

    End Sub

 

Bu bölümde yapılan şey sadece bir DataTable oluşturmak, aslında önemli olan DataGrid de görüntülenecek olan Tablonun şema (schema) sını oluşturabilmek ve içine varsayılan olarak iki tane daha data yazıyorum.

Adım adım neler yaptığımı incelersek, ilk önce Butona Clicklenme prosedüründende önce bir DataTable türünden dt değişkenini oluşturuyorum, daha sonra 3 elemanlı bir DataColumn arrayi oluşturuyorum ilk kolon un adını KullaniciAdi yapıyorum, bu kolonun veri türünü belirliyorum ve bu kolonun içindeki rakamların tek tek artması gerektiğini artmaya 1 den başlamaları gerektiğini ve tek tek artmaları gerektiğini anlatıyorum, ikinci kolonun adını AdiVeSoyadi yapıyorum ve veritürünün String olması gerektiğini anlatıyorum, üçüncü kolonun adi ise Yasi, veritürünü yine Int16 şeklinde olmaını istiyorum ve varsayılan değerine 0 diyorum, yani kullanıcı eğer buraya bir değer girmezse bu bölüm boş kalmasın en kötü 0 yazılsın diye. Daha sonra bu kolonları DataTable nin Columns propertysindeki AddRange metodu ile DataTableye ekliyorum.

Sırada bu şemasını oluşturduğum tabloya veri eklemeye geldi, iki tane veri ekliyorum dikkat ederseniz ilk sütüna veri eklemiyorum çünkü orası otomatik artan veri türünde. Son olarakta bu yeni oluşturduğum iki satırı DataTable nin Rows özelliğinin Add metodunu kullanarak DataTableye ekliyorum. En son olarakta bu DataTablenin DataSet te görüntülenmesini sağlıyorum.

 

Bu bölüme kadar sadece DataTable oluşturduk, sırada seriileştirme işlemi var, seriileştirme işlemi bir formatter yardımıyla verilerin başka bir biçime dönüştürülmesini sağlayan yapıdır, aslında seriileştirme işleminde dikkat edilmesi gereken nokta sadece Public olan alanların seriileştirildiğidir, şimdi benim amacım aslında bir Component olan DataSeti seriileştirmek, ilk olarak XML yöntemini kullanacağım, bir DataSet i XML seriileştirmek demek, DataSet ile birlikte içindeki bütün yapıların HDD ye bir dosya olarak yazılması demek, bunu illa bir dosyaya yazmanıza gerek yok isterseniz başka bir şekildede kullanabilirsiniz (örneğin Remoting :) XML seriileştirme çok kolaydır, ilk iş olarak iki tane NameSpace mizi en yukarıya Imports deyimi ile yazın.

Imports System.Xml.Serialization

Imports System.IO

Daha sonra yapacağınız işlem buton iki ye click işlemine gitmeniz. Buraya aşağıdaki kodu yazın.

 

    Private Sub Button2_Click(ByVal sender As System.Object,_

    ByVal e As System.EventArgs) Handles Button2.Click

        Dim ds As DataSet = New DataSet

        ds.Tables.Add(DataGrid1.DataSource)

        Dim xm As XmlSerializer = New XmlSerializer(GetType(DataSet))

        Dim stw As TextWriter = New StreamWriter("db.xml")

        xm.Serialize(stw, ds)

        stw.Close()

    End Sub

 

Burada neler yaptığımızı inceleyelim, ilk iş olarak bir DataSet tanımlıyorum ismi ds, neden DataSet tanımladığımı hemen belirteyim çünkü DataTable XML olarak serialize edilemez, peki neden diye soracak olursanız aşağıdaki resimlere bakmanız yeterli olacaktır.

Gördüğünüz gibi DataTable türetilirken DataSet gibi IXmlSerializable interface si ile implement edilmemiş bundan dolayı DataTable XML olarak serialize edilemez.

Devam edelim, DataSet e yeni bir Table ekledim ve bu tabloda DataGriddeki o andaki veriler, bunu yapmamın nedeni, kullanıcı veritabanına bir veri girince yada bir veri silince tekrar “Diske Yaz” dediğinde o andaki kullanıcının düzenlediği bilgileri alabilmek, sonrasında xm isminde bir XmlSerializer tanımlıyorum, bütün seriileştirme işini yapacak olan Class bu, bu Class ın kurucu metodu ise hangi türden nesneyi seriileştireceğimi istiyor, bende ona tür olarak DataSetin türü olduğunu anlatıyorum.

Sonrasında verileri HDD ye yazmak için bir TextWriter tanılıyorum ve bunun instancesini oluştururken StreamWriter dan oluşturuyorum, oluşacak dosyanın adınada “db.xml” diyorum, Seriileştirme işinin en önemli noktası burası, XmlSerializer türünden oluşturduğum bu classın içindeki Serialize metodunu kullanarak bir TextWriter vasıtasıyla ds isimli DataSet nesnemi serialize ediyorum. Son olarakta demin açtığım TextWriter nesnesini close ediyorumki bu dosyayı daha sonra kullanabileyim.

 

Kulllanıcının DataGrid e girdiği nesneleri Hard Diskte bir dosya oluşturarak yazan yöntemi oluşturduk, şimdi sırada bu dosyayı geri okuyup, DataGrid de tekrar göstermeye geldi, bunun için üçüncü butonu kullanacağız, üçüncü buttona iki kere tıklayın ve aşağıdaki kodları yazın.

 

    Private Sub Button3_Click(ByVal sender As System.Object,_

    ByVal e As System.EventArgs) Handles Button3.Click

        Try

            Dim xm As XmlSerializer = New XmlSerializer(GetType(DataSet))

            Dim str As FileStream = New FileStream("db.xml", FileMode.Open)

            Dim rd As Xml.XmlTextReader = New Xml.XmlTextReader(str)

            DataGrid1.DataSource = CType(xm.Deserialize(rd), DataSet).Tables(0)

            str.Close()

        Catch ex As Exception

            MessageBox.Show("Hata olustu, Hata MSG si : " & ex.Message)

        End Try

    End Sub

 

Bu bölümde yine ilk olarak XmlSerializer türünde bir değişken oluşturduk ve deminki mantıkla bu nesnenin türünü DataSet olarak verdik, sonrasında bir FileStream oluşturdum amacım önceden seriileştirdiğim bu dosyayı bulup, deserialize etmek, FileStream ile dosyayı open modda açtığıma dikkat edin. Sonrasında bir XmlTextReader oluşturup bu deminki FileStram ı ona parametre olarak veriyorum, artık herşey hazır sadece deserialize etme işi kaldı, XmlSerializer classının Deserialize metoduna XmlTextReader imi veriyorum, ama burada şuna dikkat edin, Deserialize Metodu geriye Object döndürüyor, işlerin daha hızlı yürümesi adına ben explicit olarak conversation yapıyorum, CType ile gelen nesneyi DataSet türüne çeviriyorum. Ve bu DataSet nesnesinin içindeki Tablolardan ilkini göstereceğimi anlatıyorum.

Son olarak siz denemelerinizi yaparken DataGrid in gerçekten dolduğuna emin olun diye DataGrid  i temizleyen butonunda yaptığı işi yazalım.

    Private Sub Button4_Click(ByVal sender As System.Object,_

    ByVal e As System.EventArgs) Handles Button4.Click

        DataGrid1.DataSource = Nothing

    End Sub

Böylece Testlerinizi yapabilirsiniz.

Ben Sadece XML ile seriileştirmesini gösterdim, ancak siz isterseniz buradaki seriileştirme işlemini Binary de yapabilirsiniz.

 

Bu yazımızda XML serialization kullanarak çok basit bir tablo için bir veritabanı mantığı kullanmak yerine dosyalarımız XML de tutarak işlemler yaptık. Başka bir yazıda görüşmek üzere... Eleştirileriniz, önerileriniz ve sorularınız için her zaman cenkc@yazgelistir.com mailimi kullanabilirsiniz.

 

Levent Cenk ÇAĞLAR

cenkc@yazgelistir.com