Windows Store Uygulamalarında XML Serialization

Standard

Serialization, en genel haliyle bir veri yapısını ya da nesneyi saklanabilecek ya da taşınabilecek bir biçime dönüştürme işlemidir. Bu işlemin amacı genelde bir veri yapısını dosya içinde saklamak ya da ağ üzerinden bir başka konuma aktarabilmektir, ki bu sayede ardından deserialization işlemi uygulanarak nesneye istenilen zamanda ya da konumda ulaşılabilir.

Buna örnek olarak bir haber uygulamasını verebiliriz: Haberleri ilk açılışında internetten çekip, ardından serialization işlemi uygulayarak bir dosyaya kaydedebilir, sonrasında ise güncellemesi için belirli bir süre geçmediği takdirde her açılışta haberleri sıfırdan indirmek yerine dosyadan çok daha hızlı bir şekilde okuyarak kullanıcıya gösterebilir (ya da, haberlerin indirilmesi uzun sürüyorsa, bu süre içerisinde ekranın boş olmaması için en son indirdiği haberleri gösterebilir). Başka bir örnek de, bir kullanıcının Facebook’taki hareketlerini Facebook’a bağlanarak almak istediğimizde bize bunu serialization uygulanmış halde vermesini ve bizim kendi uygulamamızda bunu deserialization ile uygun bir sınıfa dönüştürmemizi verebiliriz.

Bu yazımda, bir Windows Store uygulamasında kendi sınıfımızın bir listesini XML Serialization kullanarak dosyaya kaydedip, ardından okuyan örnek bir uygulama oluşturacağız.

Bunun için Visual Studio 2012’yi açıp, yeni bir Windows Store Blank App projesi açalım.

1

Uygulamamızda bir “Kisi” sınıfı olsun ve bu sınıfın bir listesini saklayarak listeleyelim. Öncelikle arayüzü oluşturmak için MainPage.xaml içerisine aşağıdaki kod ile bir ListView ve üç adet Button ekleyelim:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <ListView x:Name="KisiListView" HorizontalAlignment="Left" Margin="50,100,0,50" Width="315" Background="#FF555555">
            <ListView.Resources>
                <DataTemplate x:Key="ListViewDataTemplate">
                    <Grid Height="100" Width="200" Background="#FF49B5DC">
                        <TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="{Binding Ad}" VerticalAlignment="Top" FontSize="15" Foreground="White"/>
                        <TextBlock HorizontalAlignment="Left" Margin="10,40,0,0" TextWrapping="Wrap" Text="{Binding Soyad}" VerticalAlignment="Top" FontSize="15" Foreground="White" />
                        <TextBlock HorizontalAlignment="Left" Margin="10,70,0,0" TextWrapping="Wrap" Text="{Binding Puan}" VerticalAlignment="Top" FontSize="15" Foreground="White" />
                    </Grid>
                </DataTemplate>
            </ListView.Resources>
            <ListView.ItemTemplate>
                <StaticResource ResourceKey="ListViewDataTemplate"/>
            </ListView.ItemTemplate>
        </ListView>
        <TextBlock HorizontalAlignment="Left" Margin="50,77,0,0" TextWrapping="Wrap" Text="Kişi Listesi:" VerticalAlignment="Top" FontSize="15"/>
        <Button x:Name="KaydetButton" Content="Kişileri Dosyaya Kaydet (Serialization)" HorizontalAlignment="Left" Margin="400,115,0,0" VerticalAlignment="Top" Width="291"/>
        <Button x:Name="OkuButton" Content="Kişileri Dosyadan Oku (Deserialization)" HorizontalAlignment="Left" Margin="400,173,0,0" VerticalAlignment="Top"/>
        <Button x:Name="SilButton" Content="Kişileri ve Dosyayı Sil" HorizontalAlignment="Left" Margin="400,231,0,0" VerticalAlignment="Top" Width="291"/>
    </Grid>

Üzerinde yazdığı üzere ListView kişilerimizi listeleyecek ve Button’lar da serialization – deserialization işlemlerini yapacak. O halde, Kisi sınıfımızı da MainPage.xaml.cs içinde aşağıdaki şekilde oluşturalım:

    public class Kisi
    {
        public string Ad { get; set; }
        public string Soyad { get; set; }
        public int Puan { get; set; }
    }

Sonra da aşağıdaki şekilde üç Button’ımızın da Click eventlerini doldurarak serialization – deserialization işlemlerimizi yapalım:

using System.Xml.Serialization;
using Windows.Storage;
using Windows.UI.Popups;
        async private void KaydetButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(List<Kisi>));
                var stream = new MemoryStream();
                List<Kisi> kisiList = new List<Kisi>();
                kisiList.Add(new Kisi() { Ad = "Ad 1", Soyad = "Soyad 1", Puan = 75 });
                kisiList.Add(new Kisi() { Ad = "Ad 2", Soyad = "Soyad 2", Puan = 50 });
                kisiList.Add(new Kisi() { Ad = "Ad 3", Soyad = "Soyad 3", Puan = 15 });
                kisiList.Add(new Kisi() { Ad = "Ad 4", Soyad = "Soyad 4", Puan = 28 });
                kisiList.Add(new Kisi() { Ad = "Ad 5", Soyad = "Soyad 5", Puan = 100 });
                kisiList.Add(new Kisi() { Ad = "Ad 6", Soyad = "Soyad 6", Puan = 60 });
                serializer.Serialize(stream, kisiList);
                StreamReader reader = new StreamReader(stream);
                stream.Seek(0, SeekOrigin.Begin);
                string serializedString = reader.ReadToEnd();
                StorageFile storageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("kisilistesi", CreationCollisionOption.ReplaceExisting);
                await Windows.Storage.FileIO.WriteTextAsync(storageFile, serializedString);
            }
            catch (Exception ex)
            {
                MessageDialog messageDialog = new MessageDialog("Kişiler kaydedilemedi: " + ex.Message);
                messageDialog.ShowAsync();
            }
        }

        async private void OkuButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Kisi>));
                var kisiStream = new MemoryStream();
                using (StreamWriter writer = new StreamWriter(kisiStream))
                {
                    writer.AutoFlush = true;
                    StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("kisilistesi");
                    writer.Write(await Windows.Storage.FileIO.ReadTextAsync(storageFile));
                    kisiStream.Seek(0, SeekOrigin.Begin);
                    KisiListView.ItemsSource = (List<Kisi>)xmlSerializer.Deserialize(kisiStream);
                }
            }
            catch (Exception ex)
            {
                MessageDialog messageDialog = new MessageDialog("Kişiler okunamadı: " + ex.Message);
                messageDialog.ShowAsync();
            }
        }

        async private void SilButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("kisilistesi");
                await storageFile.DeleteAsync();
            }
            catch (Exception ex)
            {
                MessageDialog messageDialog = new MessageDialog("Kişiler silinemedi: " + ex.Message);
                messageDialog.ShowAsync();
            }
        }

Kodda göreceğiniz üzere, Kisi nesnelerimizi kaydederken XMLSerializer sınıfını kullandık ve bir stream aracılığıyla serialization işlemi uygulanmış nesneleri uygulamanın yerel klasöründe “kisilistesi” adında bir dosyaya yazdık. Okuma esnasında da bu dosyayı yine bir stream aracılığıyla okuyarak, ardından deserialization işlemiyle tekrardan bir Kisi listesine dönüştürdük.

Artık uygulamayı çalıştırabiliriz. İlk önce kişileri kaydederek dosyayı yarattıktan sonra, kişileri oku diyerek aşağıda gördüğümüz şekilde listemizi doldurabiliriz.

2

Not olarak belirtmek istiyorum, bu örnekte nesnelerimizi dosyaya kaydetmiş olduğumuz için uygulamamız silinmediği sürece kapatılıp açılsa da verilerimiz orada durmaya devam edecek, bu da kullanışlılığını arttıran bir durum.

Projenin kaynak koduna buradan ulaşabilirsiniz.

Gelecek yazılarımda görüşmek üzere.

Advertisements

Comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s