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