29 Mart 2017 Çarşamba

XmlSerializer ile Yazma

XMLSerializer Sınıfı
Giriş
Şu satırı dahil ederiz.
using System.Xml.Serialization;
XmlSerializer sadece public property'leri yazar. Public dışındaki property'lere erişmek gerekmediği için sınıfın [Serializer] ile işaretli olmasına gerek yok. Yani şu koddaki anotasyon gereksiz.
[Serializable]
public class Foo
{
  ...
}

1. Serialize edilecek sınıf public olmalı
2. Eğer kalıtım varsa en üstteki ata sınıf XmlInclude ile işaretlenmeli
[XmlInclude(typeof(DerivedMessage))]    
public class BaseMessage
{
    ...
}
Constructor Metodu
Bu sınıf verilen nesneyi XML olarak yazar ve okuyabilir. Constructor metoduna serialize edilecek nesnenin type bilgilerini veriyoruz. Örnek:
new XmlSerializer(typeof(MyClass))
Şu kullanım şekli yanlış çünkü parametre olarak System.Type tipi bekleniyor.
XmlSerializer mySerializer = new XmlSerializer(MyClass);
Serizalize Metodu - TextWriter
Şöyle yaparız.
TextWriter textWriter = new StreamWriter(@"Serialized.xml");
xmlSerializer.Serialize(textWriter,obj);
textWriter.Close();
Serizalize Metodu - XmlWriter
İçine bir XmlWriter alır.
xmlSerializer.Serialize(xmlWriter, obj);
Bu sınıf XML'in ilk düğümüne şu namespace özelliğini ekler. Bunlar "default namespace" olarak anılırlar.
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
Şöyle bir XML çıktısı alırız.
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
XmlWriter + XmlSerializerNamespaces 
Elimizde şöyle bir sınıf olsun.
[XmlRoot("Root", Namespace = "myNamespace")]
public partial class MyClass
{
    public MyClass()
    {
        this.Xmlns = new XmlSerializerNamespaces();
        this.Xmlns.Add(string.Empty, "myNamespace");
    }

    [XmlNamespaceDeclarations()]
    public XmlSerializerNamespaces Xmlns = null;
}
Bu sınıfı şöyle seralize ederiz.
serializer.Serialize(xmlWriter, obj,obj.Xmlns);
Şöyle bir XML çıktısı alırız.
<Root xmlns="myNamespace" />

Hiç yorum yok:

Yorum Gönder