0

Here are my requirements for a data structure:

  • Must be able to serialize/deserialize (using XmlSerializer)
  • Must be easily searchable (by an object's property)
  • Must implement IEnumerable so I can iterate through it easily

It will be storing objects, but I need to be able to search by a property (its name). I was initially going to use a Dictionary, but they aren't serializable unfortunately. Does anyone have any ideas?

charlieshades
  • 323
  • 1
  • 3
  • 16

1 Answers1

0

from Paul Welter's WebLog,

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

[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue>
    : Dictionary<TKey, TValue>, 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
}
Jodrell
  • 34,946
  • 5
  • 87
  • 124
  • Forgive me if I'm just understanding the code wrong, but it seems like this takes XML of the form SomeKeySomeValue and serializes it like that. I would need mine to deserialize XML to an object, then store the object in the Dictionary as the value with one of its properties as the key. – charlieshades Jul 15 '15 at 14:24