Сериализация для Dictionary> - C#
Формулировка задачи:
как сериализовать в XML Dictionary<DateTime, List<string>>?
Решение задачи: «Сериализация для Dictionary>»
textual
Листинг программы
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace Ghost
{
[XmlRoot("dictionary")]
public class GhostDictionary<TKey, TValue> :
Dictionary<TKey, TValue>,
IXmlSerializable
{
public GhostDictionary()
{
}
public GhostDictionary(IDictionary<TKey, TValue> dictionary)
: base(dictionary)
{
}
public GhostDictionary(IEqualityComparer<TKey> comparer)
: base(comparer)
{
}
public GhostDictionary(int capacity)
: base(capacity)
{
}
public GhostDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer)
: base(dictionary, comparer)
{
}
public GhostDictionary(int capacity, IEqualityComparer<TKey> comparer)
: base(capacity, comparer)
{
}
protected GhostDictionary(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
XmlSerializer keyDeserializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueDerializer = new XmlSerializer(typeof(TValue));
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.EndElement &&
reader.Name == "item")
{
reader.Read();
}
if (reader.NodeType == XmlNodeType.EndElement &&
reader.Name == "dictionary")
{
break;
}
if (reader.Name != "item")
{
throw new XmlException("Invalid XML");
}
reader.Read();
if (reader.Name != "key")
{
throw new XmlException("Invalid XML");
}
reader.Read();
TKey key = (TKey)keyDeserializer.Deserialize(reader);
reader.Read();
if (reader.Name != "value")
{
throw new XmlException("Invalid XML");
}
reader.Read();
TValue value = (TValue)valueDerializer.Deserialize(reader);
this.Add(key, value);
}
}
public void WriteXml(XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerialier = new XmlSerializer(typeof(TValue));
foreach (KeyValuePair<TKey, TValue> pair in this)
{
writer.WriteStartElement("item");
writer.WriteStartElement("key");
keySerializer.Serialize(writer, pair.Key);
writer.WriteEndElement();
writer.WriteStartElement("value");
valueSerialier.Serialize(writer, pair.Value);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}
}