6 Nisan 2018 Cuma

XMLSerializer Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Xml.Serialization;
Anotasyon tabanlı bir serializer sınıfıdır. Açıklaması şöyle.
By default this serializer takes only public fields, properties of a given type & sends them over wire. Any sensitive data must be explicitly opted out using XmlIgnore attribute.
Kullanılan bazı anotasyonlar şöyle
[XmlRoot],[XmlType],[XmlIgnore],[XmlElement], [XmlArray],[XmlArrayItem]

Circular Reference
Bu metod circular reference varsa hata veriyor. Fırlatılan exception'ın mesajı şöyle.
A circular reference was detected while serializing an object of type Foo
Elimizde şöyle bir kod olsun. Bu sınıfı XmlSerializer ile XML'e çevirmek mümkün değil.
public class Foo 
{
  ...
  public Foo Parent { get; set; }
  public List<Foo> Children { get; set; }  
}

Constructor
Verilen nesne tipini XML olarak yazar ve okuyabilir.
Örnek
Şöyle yaparız
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Deserialize metodu - Stream
Örnek ver

Deserizalize Metodu - XMLReader
Object döndürdüğü için istenilen tipe cast etmek gerekir. XMLReader kullanır. Şöyle yaparız.
using (XmlReader reader = ...))
{
  return (T)serializer.Deserialize(reader);
}
Deserialize Metodu - TextReader
Şöyle yaparız.
string str= ...;

using (TextReader reader = new StringReader(str))
{
  return (Foo)serializer.Deserialize(reader);
}
Şöyle yaparız
using (var reader = new StreamReader("config.xml"))
{
  return (T)(serializer.Deserialize(reader);
}
Serialize metodu - Stream
Örnek ver

Serialize metodu - TextWriter
TextWriter allta XMLWrite'a çevrilir. Metodun içi şöyle.
public void Serialize(TextWriter textWriter, object o,
  XmlSerializerNamespaces namespaces) {
  XmlTextWriter xmlWriter = new XmlTextWriter(textWriter);
  xmlWriter.Formatting = Formatting.Indented;
  xmlWriter.Indentation = 2;
  Serialize(xmlWriter, o, namespaces);
}
Örnek
Şöyle yaparız.
string Serialize(Type type, object objectToSerialize)
{
  StringBuilder builder = new StringBuilder();
  using (TextWriter writer = new StringWriter(builder))
  {
    XmlSerializer serializer = new XmlSerializer(type);
    serializer.Serialize(writer, objectToSerialize);
  }
  return builder.ToString();
}
Serialize metodu - XMLWriter
Örnek
Elimizde şöyle bir kod olsun.
public class DTO
{
  [XmlIgnore]
  public string additionalInformation;

  [XmlElement(Order=1)]
  public DateTime stamp;

  [XmlElement(Order=2)]
  public string name;

  [XmlElement(Order=3)]
  public double value;

  [XmlElement(Order=4)]
  public int index;
}
Şöyle yaparız.
// 1. serialize normally
// this will allow us to omit the xmlns:xsi namespace
var ns = new XmlSerializerNamespaces();
ns.Add( "", "" );

XmlSerializer s1 = new XmlSerializer(typeof(DTO));

var builder = new System.Text.StringBuilder();
var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };

using ( XmlWriter writer = XmlWriter.Create(builder, settings))
{
  s1.Serialize(writer, dto, ns);
}
Console.WriteLine("{0}",builder.ToString());
Console.WriteLine("\n");    
Çıktı olarak şunu alırız.
<DTO>
  <stamp>2009-06-30T02:17:35.918Z</stamp>
  <name>Marley</name>
  <value>72.34</value>
  <index>7</index>
</DTO>

Hiç yorum yok:

Yorum Gönder