Web services 使用为web方法实现IDictionary的内置对象的替代方法
我有一个使用ASP.NET中创建的web服务的web应用程序。在这个web服务中,我希望传递键值类型的集合对象(如Hashtable或Dictionary)。Web services 使用为web方法实现IDictionary的内置对象的替代方法,web-services,asmx,Web Services,Asmx,我有一个使用ASP.NET中创建的web服务的web应用程序。在这个web服务中,我希望传递键值类型的集合对象(如Hashtable或Dictionary)。 但是我们不能使用从IDictionary实现的对象。 我不想在web服务中创建序列化类。 有人能给我推荐最好的方法吗?您可以尝试使用两个数组,一个用于键,一个用于值,数组的索引匹配。不是最理想的解决方案,而是有效的解决方案。您可以使用IDictionary来传递该对象的键和值。dev.e.loper几乎是正确的。您可以使用列表 或者,您
但是我们不能使用从IDictionary实现的对象。
我不想在web服务中创建序列化类。
有人能给我推荐最好的方法吗?您可以尝试使用两个数组,一个用于键,一个用于值,数组的索引匹配。不是最理想的解决方案,而是有效的解决方案。您可以使用IDictionary来传递该对象的键和值。dev.e.loper几乎是正确的。您可以使用
列表
或者,您可以使用列表
MSDN文档:
- 我不太清楚你的问题,但也许你需要这样的东西
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();
}
}
}
使用System.Collections.Generic;
使用System.Xml;
使用System.Xml.Schema;
使用System.Xml.Serialization;
[XmlRoot(“字典”)]
公共类SerializableDictionary:Dictionary,IXmlSerializable
{
公共XmlSchema GetSchema()
{
返回null;
}
公共void ReadXml(XmlReader)
{
var keySerializer=新的XmlSerializer(typeof(TKey));
var-valueSerializer=新的XmlSerializer(typeof(TValue));
bool waspempy=reader.isemptyelment;
reader.Read();
如果(为空)
{
返回;
}
while(reader.NodeType!=XmlNodeType.EndElement)
{
reader.ReadStartElement(“项目”);
reader.ReadStartElement(“密钥”);
var key=(TKey)keySerializer.反序列化(reader);
reader.ReadEndElement();
reader.ReadStartElement(“价值”);
var value=(TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
添加(键、值);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
public void WriteXml(XmlWriter)
{
var keySerializer=新的XmlSerializer(typeof(TKey));
var-valueSerializer=新的XmlSerializer(typeof(TValue));
foreach(此.Keys中的var键)
{
编写人。书面启动项(“项目”);
writer.writeStart元素(“键”);
序列化(编写器,键);
writer.writeedelement();
writer.writeStarteElement(“值”);
t值=此[键];
序列化(写入程序,值);
writer.writeedelement();
writer.writeedelement();
}
}
}
您可以从可序列化的KeyedCollection继承
我使用DictionaryEntry解决了这个问题 唯一的区别是键也是对象 我基本上有一个
Dictionary-to-Dictionary(DictionaryEntry[]entries)
和一个DictionaryEntry[]fromdctionary(Dictionary-entries)
静态方法,这些方法非常轻量级,最终可以让我到达相同的位置,而不必创建自己的集合类
额外的好处是,由此产生的XML更接近WCF Web服务默认使用的XML!这意味着您现在可以在您的客户机代码中进行此更改,并且如果您决定以这种方式移动,就可以为WCF做好准备
JSON
[{“Key”:key1,“Value”:value1},{“Key”:key2,“Value”:value2}]上的结果与默认情况下在WCF上的结果完全相同。为什么不能使用字典,为什么故意避免编写序列化类?不能使用从IDictionary继承的类型作为web方法返回类型