У меня есть веб-приложение, которое использует веб-службу, созданную в ASP.NET. В этом веб-сервисе я хочу передать объект коллекции типа Key Value (например, Hashtable или Dictionay).
Но мы не можем использовать объекты, которые реализуются из IDictionary.
Я не хочу создавать сериализованный класс в своем веб-сервисе.
Может ли кто-нибудь предложить мне лучший подход для этого?Альтернатива использования встроенного объекта, который реализует IDictionary для веб-метода
ответ
Вы можете попытаться использовать 2 массива, 1 для ключей и один для значений, где индексы массивов совпадают. Не самое идеальное решение, но действительное. Внутренности веб-сервиса вы можете использовать IDictionary и просто передавать ключи и значения этого объекта.
dev.e.loper почти прав. Вы можете использовать List<Pair>
.
В качестве альтернативы вы можете использовать List<KeyValuePair<TKey,TValue>>
.
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();
}
}
}
Вы можете унаследовать от KeyedCollection, который является Serializable.
Я решил это с помощью DictionaryEntry
Единственное отличие состоит в том, что ключ является объектом, а также.
У меня в основном есть Dictionary ToDictionary(DictionaryEntry[] entries)
и статические методы DictionaryEntry[] FromDictionary(Dictionary entries)
, которые очень легкие и в конечном итоге приводят меня в одно и то же место, не делая собственный класс коллекции.
Дополнительным преимуществом является то, что XML, который приходит в результате, ближе к тому, в котором используются веб-службы WCF по умолчанию! Это означает, что вы можете сделать это изменение сейчас в своем клиентском коде и быть готовым к WCF, если вы решите двигаться таким образом.
Результат выглядит как над JSON [{"Key": key1, "Value": value1}, {"Key": key2, "Value": value2}]
точно так же, как и по WCF по умолчанию.
Почему вы не можете использовать словари и почему бы вам целенаправленно избегать написания сериализованного класса? – Juliet
Вы не можете использовать тип, который наследуется от IDictionary, как возвращаемый тип веб-метода – Vnuk