我有一个使用ASP.NET中创建的Web服务的Web应用程序。在这个,Web服务我想传递一个Key Value类型的集合对象(即Hashtable或Dictionay之类的东西)。
但是我们不能使用从IDictionary实现的对象。
我不想在我的网络服务中创建一个序列化的类。
有谁能建议我这方面最好的方法?
答案 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。
答案 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,只传递该对象的键和值。