Asp.Net Serileştirme İşlemleri

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,730
Serileştirme nedirden önce neden buna gerek duyduğumuzu bir örnekle yapalım. Uygulamamıza AdSoyad ve Yas Diye 2 adet TextBox ve 1 Adet Button ve 1 Adet GridView ekleyelim.

Kod:
public class Kisiler
{
    private string _adSoyad = "";

    public string AdSoyad
    {
        get { return _adSoyad; }
        set { _adSoyad = value; }
    }

    private int _yas = 0;

    public int Yas
    {
        get { return _yas; }
        set { _yas = value; }
    }
}
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GridView1.DataSource = KisiListesi;
            GridView1.DataBind();
        }
    }

    List<Kisiler> KisiListesi = new List<Kisiler>();
    protected void btnKaydet_Click(object sender, EventArgs e)
    {
        Kisiler kisi = new Kisiler();
        kisi.AdSoyad = AdSoyad.Text;
        kisi.Yas = Convert.ToInt32(Yas.Text);

        
        KisiListesi.Add(kisi);
        GridView1.DataSource = KisiListesi;
        GridView1.DataBind();
    }

Herseferinde 1 tane kaydın yapıldığını göreceksiniz. Asp.Net uygulamalarında her postback işleminde

Kod:
List<Kisiler> KisiListesi = new List<Kisiler>();
her seferinden yenilendiğinden tekrar işlem başa dönmektedir.

List nesnesini veya Generic Nesneleri, Veri kaynaklarını Cache veya ViewState değeri olarak tutamaz mıyız?


Cevap tutamayız olacak zira serileştirme işlemlerini gerçekleştirmeden bunu yapamayız. Generic Listler ve Veri Kaynakları
bu şekilde taşınamaz. Serileştirme işlemleri işte tamda bu konuda devreye giriyorlar.

Serialization(serileştirme), bir nesnenin o anki durumunu(içeriğini) belli bir formata dönüştürüp geçici veya kalıcı bir kaynak üzerinde depolama işlemidir.
(Ahmet KAYMAZ)


Aslında çok net bir açıklama. Bir sınıfın serileştirilebilmesi için ISerializable arayüzünden türemiş olması gerekir.

.Net te 3 tür serileştirme mevcut

  • İkili Serileştirme
    XML Serişeştirme
    Soap serileştirme

Biz bu örneğe XML serileştirmeyi uygulayalım.

Kod:
[Serializable]  
public class Kisiler
{
    private string _adSoyad = "";

    [XmlElement("AdSoyad")]
    public string AdSoyad
    {
        get { return _adSoyad; }
        set { _adSoyad = value; }
    }

    private int _yas = 0;

    [XmlElement("Yas")]
    public int Yas
    {
        get { return _yas; }
        set { _yas = value; }
    }
}
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }

    
    protected void btnKaydet_Click(object sender, EventArgs e)
    {
        List<Kisiler> KisiListesi = null;
        if (GridView1.Rows.Count > 0)
            KisiListesi = this.DeSerilestir();
        else
            KisiListesi = new List<Kisiler>();
        Kisiler kisi = new Kisiler();
        kisi.AdSoyad = AdSoyad.Text;
        kisi.Yas = Convert.ToInt32(Yas.Text);
        
        KisiListesi.Add(kisi);
        this.Serilestir(KisiListesi);

        GridView1.DataSource = KisiListesi;
        GridView1.DataBind();
    }

    private void Serilestir(List<Kisiler> KisiListesi)
    {
        //Serileştirmeyi yapmak için bir akım oluşturalım.
        //Burada örnek olarak file stream'ı kullanacağız.
        FileStream dosya = new FileStream(Server.MapPath("tmp/seri.xml"), FileMode.Create);


        //XML serileştirme yapacak nesneyi oluşturalım
        //XmlSerializer'ın yapıcı metoduna Musteri sınıfının tipi gönderilir
        XmlSerializer xmlS = new XmlSerializer(typeof(List<Kisiler>));

        xmlS.Serialize(dosya, KisiListesi);
        dosya.Close();
    }

    private List<Kisiler> DeSerilestir()
    {
        List<Kisiler> KisiListesi = null;
        //Deserialization işleminde kullanılacak serializer nesnesi
        XmlSerializer xmlS = new XmlSerializer(typeof(List<Kisiler>));

        XmlReader oXr = new XmlTextReader(Server.MapPath("tmp/seri.xml"));

        //XML verisinin Deserialize durumunu denetleyelim
        if (xmlS.CanDeserialize(oXr))
        {
            // XML verisini deserialize edelim
            KisiListesi = (List<Kisiler>)xmlS.Deserialize(oXr);
        }
        oXr.Close();
        return KisiListesi;
    }
}

Dilerseniz İkili Serileştirme (Binary Serialization) Yönteminede Bakalım

İkili serileştirme, nesneyi bit bir serileştirip , bir dosyaya kaydetmek veya .NET Remoting mimarisini kullanarak birbirinden bağımsız uygulamalar arasında taşımak için tercih edilir.
Diğer serileştirme yöntemlerinden daha hızlıdır ve daha az bir çıktı üretir.

İkili serileştirme işleminden System.Runtime.Serialization.Formatters.Binary ad alanı altında bulunan BinaryFormatter sınıfı sorumludur.
Bu sınıfın, Serialize() metodu kullanılarak nesneler ikili formata dönüştürülür aynı şekilde Deserialize() metodu kullanılarak ikili içerik uygun nesne yapısına dönüştürülür.

Örnek uygulama

Kod:
[Serializable]  
public class Kisiler
{
    private string _adSoyad = "";

    public string AdSoyad
    {
        get { return _adSoyad; }
        set { _adSoyad = value; }
    }

    private int _yas = 0;

    public int Yas
    {
        get { return _yas; }
        set { _yas = value; }
    }
}
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }

    
    protected void btnKaydet_Click(object sender, EventArgs e)
    {
        List<Kisiler> KisiListesi = null;
        if (GridView1.Rows.Count > 0)
            KisiListesi = this.DeSerilestir();
        else
            KisiListesi = new List<Kisiler>();
        Kisiler kisi = new Kisiler();
        kisi.AdSoyad = AdSoyad.Text;
        kisi.Yas = Convert.ToInt32(Yas.Text);
        
        KisiListesi.Add(kisi);
        this.Serilestir(KisiListesi);

        GridView1.DataSource = KisiListesi;
        GridView1.DataBind();
    }

    private void Serilestir(List<Kisiler> KisiListesi)
    {
        //Serileştirmeyi yapmak için bir akım oluşturalım.
        //Burada örnek olarak file stream'ı kullanacağız.
        FileStream dosya = new FileStream(Server.MapPath("tmp/kisi.bin"), FileMode.Create);

        //İkili serileştirme yapacak nesneyi oluşturalım
        BinaryFormatter Bf = new BinaryFormatter();

        Bf.Serialize(dosya, KisiListesi);
        dosya.Close();
    }

    private List<Kisiler> DeSerilestir()
    {
        List<Kisiler> KisiListesi = null;
        //Deserialization işleminde kullanılacak serializer nesnesi
        //Binary deserialize yapacak nesneyi oluşturalım

        //Nesneyi kendisinden deserialize edeceğimiz stream'i tanımlayalım
        FileStream dosya = new FileStream(Server.MapPath("tmp/kisi.bin"), FileMode.Open);

        BinaryFormatter Bf = new BinaryFormatter();
        //Stream içindeki içeriği KisiListesi nesnesine deserialize edelim.
        KisiListesi = (List<Kisiler>)Bf.Deserialize(dosya);
        
        dosya.Close();
        return KisiListesi;
    }
}


epey işinize yarayacağını umarım.
 
Serileştirme işlemlerine dair bir not.

Kod:
//burada Guid kullanamamızın sebebi aynı anda iki kullanıcının bin dosyasında çakışmasını engellemek.
    private void SerilestirmeAkimi(List<AcilirKutu> kutu)
    {
        string dosya_adi = Guid.NewGuid().ToString().Replace("-", "") + ".bin";
        ViewState["DosyaAdi"] = dosya_adi;
        //FileStream oFs = new FileStream(Server.MapPath("Uploads/Tmp/Acilirkutu.bin"), FileMode.Create);
        FileStream oFs = new FileStream(Server.MapPath("Uploads/Tmp/" + dosya_adi), FileMode.Create);
        BinaryFormatter oBf = new BinaryFormatter();
        oBf.Serialize(oFs, kutu);
        oFs.Close();
    }

    private List<AcilirKutu> DeSerilestirmeAkimi(List<AcilirKutu> kutu)
    {
        string dosya_adi = ViewState["DosyaAdi"].ToString();
        //FileStream oFs = new FileStream(Server.MapPath("Uploads/Tmp/Acilirkutu.bin"), FileMode.Open);
        FileStream oFs = new FileStream(Server.MapPath("Uploads/Tmp/Acilirkutu.bin"), FileMode.Open);
        BinaryFormatter oBf = new BinaryFormatter();
        kutu = (List<AcilirKutu>)oBf.Deserialize(oFs);
        oFs.Close();
        if (File.Exists(Server.MapPath("Uploads/Tmp/" + dosya_adi)))
            File.Delete(Server.MapPath("Uploads/Tmp/" + dosya_adi));
        return kutu;
    }
 
Geri
Üst