.Net ile Serialization Ve Deserialization
- Sevdanur GENC

- May 12, 2012
- 3 min read
Makale iceriginde Serilestirme ve Ters Serilestirme hakkinda bilgi verdikten hemen sonra bunlarla ilgili ufak bir uygulama yapmis olacagim.
Uygulama icerigi basit hazirlanmis bir ogrenci bilgi sistemine ogrencilerin verilerini kaydetmek olacak. Ayni zamanda kaydedilen verileri listeleyebilecegiz. Bu islemleri yaparkende kullandigimiz arayuzumuzle ilgili ayarlari farkli dosya turlerinde saklayabilecegiz. Simdi uygulamaya gecmeden once dilerseniz oncelikle Serilestirme ve Ters Serilestirme olaylarindan biraz bahsedeyim...
Serialization (Serilestirme) Nedir ?
Projelerimizde kullandigimiz nesneleri saklayabilecegimiz yada baska formatlara aktarirken kullandigimiz donusturebilecegimiz bir islemdir diyebiliriz. Object'imizin bir kopyasini alip, o kopyaya ulasabilecegimiz fiziksel baska formata tasirken nesnenin o anki halini de saklayabilecegimiz bir koruma ayni zamanda donusturme islemidir. .Net Framework tarafinda ise bu islemleri gerceklestirebilmemiz icin kullanacagimiz namespace'imiz System.Runtime.Serialization 'dir. Bu namespace in kullanmis oldugu sinif ve de metodlar sayesinde islemlerimizi gerceklestirebiliyor olacagiz. Kullanilmasinin amaci ise tamamen verilerimizin bulunacagi ortamin kucultulmesi ve ayni zamanda tabikide performansi daha saglikli bir sekilde kullanilabilmesidir. Uygulamalarinizda kullanabileceginiz diger bir ortam WCF'de olabilir. Serilestirme isleminin 3 farkli yontemi bulunmaktadir; Xml Serialization ;
Kullandiginiz nesneyi serilestirirken veri turune bakmaksizin o nesnenin tum ortak ozelliklerini, degiskenlerini ve metodlarini serilestirebiliyor. Genellikle windows ve web uygulamalari arasindaki iletisimleri saglarken bu tarz bir serilestirme kullanabiliyoruz.
Binary Serialization ; Ikili Serilestirme olarakta anilmaktadir. En performansli serilestirme islemi olarak bilinmektedir.
SOAP Serialization ; Serilestirme yapacagimiz ortam .Net Framework ortamlarinda kullandigimiz bir nesne degilde diger platformlardan bir nesne ise bunu o ortamlardan oncelikle okutturmamiz gerekiyor. Bu islemleri de SOAP ile birlikte yapmaktayiz. XML yapisina cok fazla benzemektedir, ancak tabiki de kendine ozgu bir yapi icermektedir.
Deserialization (Ters Serilestirme) Nedir ?
Serilestirme ile aktarmis oldugumuz nesnelerin veri hallerini okutturabilmemiz icin gerekli bir islemdir. Kisacasi kullanacaginiz akisin nesneye donusturulmus hali olmaktadir. Serilestirdigimiz nesneyi orjinal haline donusturme islemide denilebilir.
Uygulama ;
Simdi dilerseniz uygulamamiza gecelim, C# ortaminda yeni bir Windows Form Application olusturalim.
Olusturdugumuz projenin klasor yapisinda bin\debug icerisinde bir xml ve bin dosyasi olusturalim ve gecici olarak iceriklerine su komutlari yazalim. Gecici olarak diyorum cunku uygulamamiz callistiginda icerisinde ki verileri tekrar tekrar serilestirilmis yani kopyalanmis olacaktir.
FormEkranGoruntusu taglari arasinda olusturmus oldugumuz degerleri projemizde class icerisinde tanimlayip, serilestirme islemlerinde kullanacagiz. Degiskenlere atanmis olan bu degerler ise uygulama calisip sona erdiginde degisecektir. Xml dosyamizi FormView.XML ismi ile bin\debug icerisinde kaydettikten sonra form application'imiza gecebiliriz.
MenuStrip nesnemiz ile formumuzdan cikis yaparken verileri XML ve BIN dosyalarina kaydetmesi icin gerekli olan serilestirme komutlari yer alacaktir.
ListView nesnemize kaydetmis oldugumuz verileri .txt uzantili metin belgesinden getirecektir.
Form ilk acildiginda FormView.XML'den okuyacagi boyut ve konum noktalarina gore kendisini ayarlayacaktir. Ayni sekilde hangi boyut ve konumlarda formumuz kapanirsa yine ayni dosyaya bu bilgiler kaydedilmis olacaktir.
Dilerseniz artik kod kismina gecebiliriz.
FormEkranGoruntusu.Cs Kaynak Kodlari ;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace Serilestirme
{
public class FormEkranGoruntusu
{
public int XNoktasi, YNoktasi;
public int Genislik, Yukseklik;
public Point Nokta
{
get { return new Point(XNoktasi, YNoktasi); }
}
public Size Boyut
{
get { return new Size(Genislik, Yukseklik); }
}
}
}
OgrenciBilgiSistemi.Cs Kaynak Kodlari ;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Serilestirme
{
class OgrenciBilgiSistemi
{
public string OgrenciNo;
public string AdSoyad;
public string Bolum;
}
}
Form1.Cs Kaynak Kodlari ;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Text.RegularExpressions;
namespace Serilestirme
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnKaydet_Click(object sender, EventArgs e)
{
FileStream
DosyaIcerigi = new FileStream("OgrenciBilgiSistemi.txt", FileMode.Append);
StreamWriter
StrWrt = new StreamWriter(DosyaIcerigi);
StrWrt.WriteLine(string.Format("{0};{1};{2}", txtOgrenciNo.Text, txtAdSoyad.Text, txtBolum.Text));
StrWrt.Close();
DosyaIcerigi.Close();
DosyadanVerileriCagir();
}
private void DosyadanVerileriCagir()
{
int Sayac = 0;
string[] Dizi;
listView1.Items.Clear();
FileStream
DosyaIcerigi = new FileStream("OgrenciBilgiSistemi.txt", FileMode.Open);
StreamReader
StrRdr = new StreamReader(DosyaIcerigi);
string Satir = StrRdr.ReadLine();
while (Satir != null)
{
Sayac++;
Dizi = Satir.Split(';');
listView1.Items.Add(new ListViewItem(Dizi));
Satir = StrRdr.ReadLine();
}
StrRdr.Close();
DosyaIcerigi.Close();
label4.Text = "Sistemdeki Toplam Ogrenci Sayisi = " + Sayac;
}
private void Form1_Load(object sender, EventArgs e)
{
FormEkranGoruntusuAyarYukle();
DosyadanVerileriCagir();
}
private void FormEkranGoruntusuAyarKaydet()
{
FormEkranGoruntusu FormGorunum = new FormEkranGoruntusu();
FormGorunum.XNoktasi = this.Location.X;
FormGorunum.YNoktasi = this.Location.Y;
FormGorunum.Genislik = this.Width;
FormGorunum.Yukseklik = this.Height;
FileStream
DosyaIcerigi = new FileStream("FormView.xml", FileMode.Create);
XmlSerializer
XmlSrl = new XmlSerializer(typeof(FormEkranGoruntusu)); XmlSrl.
Serialize
(DosyaIcerigi, FormGorunum);
DosyaIcerigi.Close();
FileStream
BinaryDosyaIcerigi = new FileStream("FormView.bin", FileMode.Create);
BinaryFormatter
BinFrmt = new BinaryFormatter(); BinFrmt.
Serialize
(BinaryDosyaIcerigi, FormGorunum);
BinaryDosyaIcerigi.Close();
}
private void FormEkranGoruntusuAyarYukle()
{
if (File.Exists("FormView.xml"))
{
FileStream
DosyaIcerigi = new FileStream("FormView.xml", FileMode.Open);
XmlSerializer
XmlSrl = new XmlSerializer(typeof(FormEkranGoruntusu)); FormEkranGoruntusu FormGorunum = (FormEkranGoruntusu)XmlSrl.
Deserialize
(DosyaIcerigi);
this.Size = FormGorunum.Boyut;
this.Location = FormGorunum.Nokta;
DosyaIcerigi.Close();
}
if (File.Exists("FormView.bin"))
{
FileStream
BinaryDosyaIcerigi = new FileStream("FormView.bin", FileMode.Open);
BinaryFormatter
BinFrmt = new BinaryFormatter(); FormEkranGoruntusu FormGorunum = (FormEkranGoruntusu)BinFrmt.
Deserialize
(BinaryDosyaIcerigi);
this.Size = FormGorunum.Boyut;
this.Location = FormGorunum.Nokta;
BinaryDosyaIcerigi.Close();
}
}
private void cikisToolStripMenuItem_Click(object sender, EventArgs e)
{
FormEkranGoruntusuAyarKaydet();
Application.Exit();
}
}
}
FormView.Xml Kaynak Kodlari ;
<?xml version="1.0"?> <
FormEkranGoruntusu
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <XNoktasi>466</XNoktasi> <YNoktasi>249</YNoktasi> <Genislik>339</Genislik> <Yukseklik>396</Yukseklik> </
FormEkranGoruntusu
>
Uygulamanin Ekran Goruntusu ;
Boylelikle uygulamanizi yukaridaki menuden kapattiginizda formunuzun ekrandaki boyut ve konumlarini serilestirme icin kullandiginiz dosyalarin icerisine kaydetmis olacaktir. Keyifli Calismalar Dilerim...
Comments