yazılım,c# ve domates kabuğu
« Yazılımcı AraçlarıTasdix, Türk Blog Yazarları ile buluşuyor »

Serialization nedir, nerede kullanılır ?

  13/02/08 10:54, by ertan, Categories: c#, Coding

Biraz uzun bir yazı oldu ancak halen yeterli olduğunu düşünmüyorum ancak konuyu bilmeyenler için hızlı bir giriş ve önemli konuları anlatabilirim umarım.

Serialization tanımladığınız class'ları memory, disk, network gibi katmanlardan geçirmek için kullandığınız teknolojidir. .Net içinde Remoting, WebServices gibi geniş alanlarda siz farkında olmadan sessiz sedasız çalışırlar.

Tanımladığınız class serialize edilirken kullanacağınız formata göre farklı şekillerde formatterlar kullanılır. Format olarak .Net içerisinde Xml ve Binary olarak temel 2 format için formatter tanımlanmıştır.

Serialization'da temel olarak yöntem bir obje üzerinden diğer tüm obje ilişkileri çözülerek bir hedef kaynağa tüm özellikler yazılır. Karşı tarafta da aynı işlemin tersi yapılarak obje yeniden hayata geri döndürülür.

Serialization sırasında objeniz üzerindeki Method, Property gibi özellikler kaydedilmez, sadece ve sadece private olarak tanımlanmış class üzerindeki tüm yer kaplayan bilgiler (string, datetime, başka bir class) kaydedilir. Bu işlem system.reflection ile class üzerinde tüm değişkenler taranarak yapılır. Bu yüzden class'ı yeniden hayata geçirek olan tarafda o class'ın biliniyor olması gereklidir, yani client ve server tarafında aynı class'ın tanımlanmış olması (dll yada farklı yöntemlerle) gerekli.

Bu arada System.Reflection kullanıldığı ve genel bir sistem için tasarlandığından standart class yaratıp kullanmaya göre biraz daha yavaş çalışır ama korkulacak seviyede bir yavaşlıktan bahsetmiyorum.

Binary Formatter

Binary formatter çoğunlukla hız gereken yerlerde (Remoting) gibi kullanılılır. Mesela Client/Server bir uygulama yazmak istediğinizde classlarınızın çok hızlı şekilde client ve server arasında dolaşmasını istiyorsanız bu format sizin için uygun olacaktır.

Aynı şekilde bir class'ı diske kaydetmek istediğinizde .Net size itiraz etmez ancak pratikte bunun bazı yan etkileri olacaktır. Bu detaylara ilerleyen kısımda geliriz.

Xml Formatter

Bu formatda class xml formatına dönüştürülerek yapılır. Üretilen Xml formatı açık olduğu için herhangi bir başka uygulama yada platform tarafından okunabilir. Böylece web servislerinin tüm kapıları açılır.

Örnek olması için başka bir blog'dan aldığım örnek;

Code

public class Person
 
{
 
    [XmlElement("FirstName")]
 
    public string Name { get; set; }
 
    public List<Pet> Pets { get; set; }
 
}
 
 
 
public class Pet
 
{
 
    [XmlAttribute("Name")]
 
    public string Name { get; set; }
 
    [XmlAttribute("Breed")]
 
    public string Type { get; set; }
 
}

class'larını serialize etmek isteğinizde;

XML

<PetClub xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
  <Members>
 
    <Person>
 
      <FirstName>Jon</FirstName>
 
      <Pets>
 
        <Pet Name="Chester" Breed="Savannah Cat" />
 
        <Pet Name="Abby" Breed="Domestic Miniature Panther" />
 
      </Pets>
 
    </Person>
 
    <Person>
 
      <FirstName>Dan</FirstName>
 
      <Pets>
 
        <Pet Name="Lucy" Breed="Semi-sweet Chocolate Lab" />
 
      </Pets>
 
    </Person>
 
  </Members>
 
</PetClub>

bir xml dosyası oluşacaktır. Bunu yapmak için;

Code

public static string ConvertToXml(object item)
 
{
 
    XmlSerializer xmlser = new XmlSerializer(item.GetType());
 
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
 
    {
 
        xmlser.Serialize(ms, item);
 
        UTF8Encoding textconverter = new UTF8Encoding();
 
        return textconverter.GetString(ms.ToArray());
 
    }
 
}

metodunu kullanabilirsiniz.

Dikkat

Serialization dikkatli kullandığınız sürece her zaman için işinize yarayacak bir araçtır. Ancak yanlış kullanımlarda başınıza ciddi sorunlar açabilir.

Diske kayıt işlemleri için ASLA binary formatter kullanmayın. Aksi halde class'larınız üzerinde değişiklik yaptığınızda yada versiyon'u numarasını değiştirdiğinizde eski verileri okuyamazsınız. (Bunu atlatmanın yolları var ancak pratikte pek işinize yaramaz)

Client/Server konuşmaları için ASLA xml formatter kullanmayın. Aksi halde ciddi performans sorunları yaşayabilirsiniz. Web servisleri içinde xml formatter kullanılsa da bu servisler zaten yavaş çalışacağı bilinerek tasarlandığından sorun olmaz ancak client server tipi uygulamalarda kabul edilen sınırı aşan bir yavaşlık yaşarsınız.

Yeterli zamanınız varsa xml için kendi mekanizmanızı oluşturun. Bu xml verisini okumak ve class'ları başlatmak için çok daha hızlıdır.

Code

public interface IXmlSerializable
 
{
 
    void XmlParse(XmlNode node);
 
    void XmlCompile(XmlWriter writer);
 
}

şeklinde bir interface tanımlayarak kendi serialize metodlarınızı tanımlayabilirsiniz. Bu sayede reflection olmadan hızlı yollarla ve versiyon değişikliklerinden etkilenmeden yola devam edebilirsiniz.

1 comment

Comment from: Osman ERTAŞ [Visitor]  
Osman ERTAŞ

selam ertan
.net içinde bulunan .clone metoduyla ilgili sorunlar ya?ad???m için kullanmak istemiyorum, baz? durumlarda bu metod klonlanacak nesnenin parentinde event tetikleyebiliyo (örne?in xml element.clone). nesneleri örne?in bir treeview nesnesini tüm propertyleriyle alt dü?ümleriyle falan serializasyon kullanarak klonlayabilirmiyiz? örnek verirsen ..

14/06/09 @ 23:53

Leave a comment


Your email address will not be revealed on this site.
  
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)
Text Renderers: