Return to Snippet

Revision: 34457
at October 22, 2010 18:15 by dzr_gregory


Initial Code
[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader xmlReader)
    {
        XmlSerializer keyXmlSerializer     = new XmlSerializer(typeof(TKey));
        XmlSerializer valueXmlSerializer   = new XmlSerializer(typeof(TValue));

        if (xmlReader.IsEmptyElement)
            return;

        xmlReader.ReadStartElement("root");

        while (xmlReader.NodeType != XmlNodeType.EndElement)
        {
            xmlReader.ReadStartElement("item");
            xmlReader.ReadStartElement("key");

            TKey key = (TKey)keyXmlSerializer.Deserialize(xmlReader);

            xmlReader.ReadEndElement();
            xmlReader.ReadStartElement("value");
            TValue value = (TValue)valueXmlSerializer.Deserialize(xmlReader);
            xmlReader.ReadEndElement();

            this.Add(key, value);
            xmlReader.ReadEndElement();                
        }

        xmlReader.ReadEndElement();
    }

    public SerializableDictionary<TKey, TValue> ReadFromString(string xmlString)
    {
        SerializableDictionary<TKey, TValue> result = null;

        StringReader stringReader = new StringReader(xmlString);
        XmlTextReader xmlTextReader = new XmlTextReader(stringReader);

        ReadXml(xmlTextReader);

        xmlTextReader.Close();
        stringReader.Close();

        return result;
    }

    public void WriteXml(XmlWriter xmlWriter)
    {
        XmlSerializer keyXMLSerializer     = new XmlSerializer(typeof(TKey));
        XmlSerializer valueXMLSerializer   = new XmlSerializer(typeof(TValue));

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

            xmlWriter.WriteStartElement("key");
            keyXMLSerializer.Serialize(xmlWriter, key);
            xmlWriter.WriteEndElement();

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

            xmlWriter.WriteEndElement();
        }
    }        

    public string SerializeToString()
    {
        string result = null;
        MemoryStream memoryStream = new MemoryStream();
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        xmlTextWriter.Namespaces = true;
        
        WriteXml(xmlTextWriter);

        xmlTextWriter.Close();
        memoryStream.Close();

        result = Encoding.UTF8.GetString(memoryStream.GetBuffer());
        result = result.Substring(result.IndexOf(Convert.ToChar(60)));
        result = result.Substring(0, (result.LastIndexOf(Convert.ToChar(62)) + 1));
        result = "<root>" + result + "</root>";

        return result;
    }
}

Initial URL
http://i-liger.com/article/xml-serializatsiya-generic-dictionary

Initial Description
Original posted here: http://i-liger.com/article/xml-serializatsiya-generic-dictionary

Initial Title
SerializableDictionary using IXmlSerializable

Initial Tags


Initial Language
C#