替代使用为Web方法实现IDictionary的内置对象

时间:2009-05-16 13:58:09

标签: web-services asmx

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

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

我不想在我的网络服务中创建一个序列化的类。

有谁能建议我这方面最好的方法?

5 个答案:

答案 0 :(得分:3)

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

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

MSDN文档:

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分:1)

您可以继承KeyedCollection,它是Serializable。

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

答案 3 :(得分: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完全相同。

答案 4 :(得分:0)

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