-- Ağ Programlama, C#

C# ile Binary Serialization

Merhabalar,

Bu makalede lafı hiç uzatmadan serileştirme(Serialization) yöntemlerinden biri olan Binary Serialization’ı inceleyeceğiz.

Serialization Nedir?

Yazılım uygulamalarında bazı verileri yazılımın çalıştığı sisteme kaydetmemiz ya da ağ üzerinden farklı bir kaynağa iletmemiz gerektiği durumlar olabilir. Eğer yerel sisteme veri kaydetmemiz gerekirse bu göreceli olarak kolaydır. Çünkü herhangi bir ek protokol ya da sınırlandırma minimum düzeydedir. Herhangi bir dosya formatı şeklinde kendi sisteminize kaydedebilirsiniz. Yüksek ihtimal bunun için gerekli Framework sınıfları da kullandığınız platform içerisinde hazırdır. Ancak yazılımınız ile ağ üzerinden ya da internet üzerinden farklı bir noktaya veri aktarımı yapmak istediğinizde burada platformlar ve protokoller arası uyuşmazlıklar söz konusu olabilir. Örneğin sizin geliştirdiğiniz yazılım .NET ile geliştirildiyse ve ama karşıya gönderilen veriyi alıp işleyecek farklı bir yazılım varsa ve bu yazılım .NET harici bir platformla geliştirildiyse, burada tercih etmeniz gereken yöntem mecburi olarak ortak bir serileştirme yöntemi olmalıdır. Ya da yazılımınızın yerel bir ağ da olması ile internet üzerinden veriyi aktarması gibi durumlar arasında da serileştirme yöntemlerinde farklı mecburiyetler sonucunda seçimler yapılması gerekmektedir.

Serileştirme Yöntemleri

Çok özetle serileştirmeyi anlatmaya çalıştım. Daha detayları spesifik olarak anlatacağım.

Binary Serialization Nedir?

Yazılımınızın veriyi binary formatında saklamasıdır. Kaydettiğiniz dosyanın uzantısını kendiniz belirleyebilirsiniz. Sonuç olarak hiç bir şey değişmeyecektir. Çünkü binary olarak yazan(Serialization) da, okuyan(Deserialization) da siz olacaksınız. Tabi ki .NET Framework ile bir binary serialization yapıp, oluşturduğunuz binary dosyayı Java gibi farklı bir platform ile OKUYAMAZSINIZ. Binary yöntemi kullanacaksanız genel özet aşağıdaki gibidir;

  • İstediğiniz dosya uzantısını belirleyebilirsiniz.
  • Ağ üzerinden TCP ile veri aktarım hızı çok yüksektir. Yani bilgisayarlar arası veri aktarımında Binary Serialization yöntemi gayet doğru tercih olabilir.
  • Bir web uygulamasın sunucudan istemciye veri aktarımında doğrudan kullanılamaz. HTTP protokolünü doğrudan desteklemez. (Binary bir veriyi XML ile string olarak sunmak bu aşamada default bir çözüm değildir. Bu nedenle YAPILABİLİR olarak saymıyoruz. Bu binary veriyi XML ile aktarıp karşı tarafta binary’e çevirme yöntemidir.)
  • Bu yöntem platformlar arası uyumluluğa sahip değildir. Eğer .NET Framework(C# vb.) ile binary serialization yöntemi uyguladıysanız Java ya da başka bir dil ile Deserialization yapamazsınız.

Uygulamamızı geliştirmeye başlayabiliriz. Öncelikle gerekli namespace’leri ekleyelim;

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

Örneğe başlayabiliriz;

Temel Kullanım

Serialization metot örneği;

static void Serialize(string data)
{
    try
    {
        using (FileStream fsWrite = new FileStream("Serialize.co", FileMode.Create))
        {
            BinaryFormatter bfWrite = new BinaryFormatter();
            bfWrite.Serialize(fsWrite, data);
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Hata : " + ex.Message);
    }
}

Not : Serialization veriyi binary formatına dönüştürme, Deserialization ise binary’den geriye(veriye) döndürme işlemine denir.

Deserialization metot örneği;

static string Deserialize()
{
    try
    {
        string result = string.Empty;
        using (FileStream fsRead = new FileStream("Serialize.co", FileMode.Open))
        {
            BinaryFormatter bfRead = new BinaryFormatter();
            result = bfRead.Deserialize(fsRead).ToString();
        }
        return result;
    }
    catch (Exception ex)
    {
        throw new Exception("Hata : " + ex.Message);
    }
}

Yukarıdaki metotların kullanımı ise gayet basittir;

// Serialize Kullanımı

Console.Write("Veri : ");
string veri = Console.ReadLine();
Serialize(veri);

// Deserialize Kullanımı

Console.WriteLine(Deserialize());

Bir Sınıf Yapısını Serileştirmek

Peki bir sınıf yapısı üzerinden bu işlemi nasıl yapabiliriz? Şimdi bunu inceleyelim…

Serileştirme işleminde kullanacağımız sınıfımız;

[Serializable]    // Mutlaka yazılmalıdır. Aksi halde bu sınıf serileştirilemez.
class Kullanici
{
    public int KullaniciId { get; set; }
    public string KullaniciAd { get; set; }
    public string Email { get; set; }
    public string Sifre { get; set; }
}

Not : Eğer bu nesnenin bir özelliğini serileştirmenin dışında tutmak isterseniz [NonSerialized] niteliğini kullanabilirsiniz.

“Non Serialized” Örnek;

[NonSerialized]
public string Sifre { get; set; }

Bu sınıf üzerinden anlatmak gerekirse Serializetion ve Deserialization metotları aşağıdaki gibi olabilir.

static void Serialize(Kullanici data)
{
    try
    {
        using (FileStream fsWrite = new FileStream("Serialize.co", FileMode.Create))
        {
            BinaryFormatter bfWrite = new BinaryFormatter();
            bfWrite.Serialize(fsWrite, data);
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Hata : " + ex.Message);
    }
}

static Kullanici Deserialize()
{
    try
    {
        Kullanici result;
        using (FileStream fsRead = new FileStream("Serialize.co", FileMode.Open))
        {
            BinaryFormatter bfRead = new BinaryFormatter();
            result = (Kullanici)bfRead.Deserialize(fsRead);
        }
        return result;
    }
    catch (Exception ex)
    {
        throw new Exception("Hata : " + ex.Message);
    }
}

Bu örnek için kullanım ise şu şekildedir;

// Serialization Kullanımı

Kullanici kSerialize = new Kullanici() { KullaniciId = 1, KullaniciAd = "Cihan", Email = "ci@han.co", Sifre = "12345" };
Serialize(kSerialize);

// Deserialization Kullanımı

Kullanici kDeserialize = Deserialize();
Console.WriteLine(kDeserialize.KullaniciAd + " " + kDeserialize.Email);

İyi çalışmalar.
Cihan Özhan

Yorumla

Yorum