Архив Тэгов: XML

.Net Программирование

Сериализация Dictionary C#

Недавно столкнулся с проблемой XML-сериализации словаря Dictionary. Оказывается, в .Net это просто-напросто не реализовано. Что же делать и как быть? Как не странно, пришлось писать свой класс, унаследованный от Dictionary и IXmlSerializable и самому реализовывать сериализацию объекта. К сожалению, другого выхода пока что не имеется(.
Когда XmlSerializer пытается обработать тип, который реализует IXmlSerializable, он просто передаст управление методу ReadXml(при десериализации) или WriteXml(во время сериализации). Другими словами, вы сами определяете как должны произойти сериализация и десериализация.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
 
    [XmlRoot("Dictionary")]
public class XmlSerializableDictionary<TKey, TValue>
    : Dictionary<TKey, TValue>, IXmlSerializable
{
    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();
        }
    }
}