XML'e serialize edilebilen Generic Dictionary

IDictionary interface'ini kullanan Dictionary,Hashtable gibi class'lardan oluşturduğunuz instance'ları xml'e serialize ettiğinizde malesef sorunlar çıkıyo. Bunun için güzel bir çözüm yazılmış.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

[XmlRoot("dictionary")]
public class SerializableDictionary : Dictionary, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}

public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

bool wasEmpty = reader.IsEmptyElement;
reader.Read();

if (wasEmpty)
return;

while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement("item");

reader.ReadStartElement("key");
TKey key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();

reader.ReadStartElement("value");
TValue value = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();

this.Add(key, value);

reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}

public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

foreach (TKey key in this.Keys)
{
writer.WriteStartElement("item");

writer.WriteStartElement("key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();

writer.WriteStartElement("value");
TValue value = this[key];
valueSerializer.Serialize(writer, value);
writer.WriteEndElement();

writer.WriteEndElement();
}
}
#endregion
}

Bu örnek kod : http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx adresinden.

Ancak eğer projenizde sadece Dictionary<string,string> gibi primitive typelardan oluşmuş bir dictionay işinizi görüyorsa bu durumda aşağıdaki methodu kullanabilirsiniz.


using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

[XmlRoot("dictionary")]
public class SerializableDictionary : Dictionary, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
if (reader.Name == "item")
{
this.Add(reader.GetAttribute("key"), reader.GetAttribute("value"));
}
reader.Read();
}
reader.Close();
}

public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(string));
XmlSerializer valueSerializer = new XmlSerializer(typeof(string));
foreach (string key in this.Keys)
{
writer.WriteStartElement("item");
writer.WriteAttributeString("key", (string)key);
writer.WriteAttributeString("value", (string)this[key]);
writer.WriteEndElement();
}
}
#endregion
}

Yorumlar

Bu blogdaki popüler yayınlar

T-SQL'de Bölme işleminde ondalıklı değerlerin korunması

'Sys' is undefined - AJAX Extensions 1.0

Datasource'u olan bir DropDownlist'e ListItem Eklemek