【问题标题】:Data structure that's easily searched but can be serialized易于搜索但可以序列化的数据结构
【发布时间】:2015-07-15 14:06:15
【问题描述】:

这是我对数据结构的要求:

  • 必须能够序列化/反序列化(使用 XmlSerializer)
  • 必须易于搜索(通过对象的属性)
  • 必须实现 IEnumerable 以便我可以轻松地遍历它

它将存储对象,但我需要能够通过属性(其名称)进行搜索。我最初打算使用字典,但不幸的是它们不可序列化。有人有什么想法吗?

【问题讨论】:

标签: c# .net serialization data-structures


【解决方案1】:

来自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
}

【讨论】:

  • 如果我只是理解代码错误,请原谅我,但这似乎需要 SomeKeySomeValue 并像这样序列化它。我需要我将 XML 反序列化为一个对象,然后将该对象作为值存储在 Dictionary 中,并将其属性之一作为键。
猜你喜欢
  • 2017-09-14
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多