2

我有一个使用在 ASP.NET 中创建的 Web 服务的 Web 应用程序。在这个网络服务中,我想传递一个键值类型的集合对象(即像 Hashtable 或 Dictionay 之类的东西)。

但是我们不能使用从 IDictionary 实现的对象。

我不想在我的 Web 服务中创建序列化类。

谁能建议我最好的方法?

4

5 回答 5

3

dev.e.loper 几乎是对的。您可以使用List<Pair>.

或者,您可以使用List<KeyValuePair<TKey,TValue>>.

MSDN 文档:

于 2009-05-16T16:55:33.060 回答
1

我对你的问题并不完全清楚,但也许你需要这样的东西?

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

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

    public void ReadXml(XmlReader reader)
    {
        var keySerializer = new XmlSerializer(typeof(TKey));
        var valueSerializer = new XmlSerializer(typeof(TValue));

        bool wasEmpty = reader.IsEmptyElement;
        reader.Read();

        if (wasEmpty)
        {
            return;
        }

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

            reader.ReadStartElement("key");
            var key = (TKey)keySerializer.Deserialize(reader);
            reader.ReadEndElement();

            reader.ReadStartElement("value");
            var value = (TValue)valueSerializer.Deserialize(reader);
            reader.ReadEndElement();

            this.Add(key, value);
            reader.ReadEndElement();
            reader.MoveToContent();
        }

        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        var keySerializer = new XmlSerializer(typeof(TKey));
        var valueSerializer = new XmlSerializer(typeof(TValue));

        foreach (var 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();
        }
    }
}
于 2009-05-16T16:58:13.663 回答
1

您可以从可序列化的 KeyedCollection 继承。

http://msdn.microsoft.com/en-us/library/ms132438.aspx

于 2010-03-18T10:41:46.800 回答
1

我通过使用 DictionaryEntry 解决了这个问题

唯一的区别是 Key 也是 Object。

我基本上有一个Dictionary ToDictionary(DictionaryEntry[] entries)和一个DictionaryEntry[] FromDictionary(Dictionary entries)静态方法,它们的重量很轻,最终让我到达同一个地方,而不必创建自己的集合类。

额外的好处是,由此产生的 XML 更接近于 WCF Web 服务默认使用的 XML!这意味着您现在可以在您的客户端代码中进行此更改,并且如果您决定采用这种方式,则可以为 WCF 做好准备。

默认情况下,JSON 上的结果[{"Key": key1, "Value": value1}, {"Key": key2, "Value": value2}]与 WCF 上的结果完全相同。

于 2011-03-23T23:44:10.383 回答
0

您可以尝试使用 2 个数组,1 个用于键,一个用于值,其中数组的索引匹配。不是最理想的解决方案,而是一个有效的解决方案。您可以使用 IDictionary 并传递该对象的键和值的 web 服务的内部结构。

于 2009-05-16T14:01:02.043 回答