Thursday, September 6, 2007

Generic.Dictionary Serializable ?

so far I know that Generic.Dictionary is not serializable by default in .Net 2.0

One of the implication is when you put your dictionary in the session of Asp.net...
You will get problem... You will get an error when serializer run and
try to get your session ship out of your web service....

Here is the code... to

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml.Serialization;

[XmlRoot("dictionary")]

public class DictionarySerializable

: 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));

if(reader.IsEmptyElement) return;

reader.Read();

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

}

No comments: