Не существует способа «по умолчанию» взять словарь и превратить его в XML. Вы должны выбрать способ, и клиенты вашего веб-сервиса должны будут знать об этом точно так же, когда они используют ваш сервис. Если и клиент, и сервер являются .NET, то вы можете просто использовать один и тот же код для сериализации и десериализации словарей в XML на обоих концах.
В этом сообщении для блога есть код для этого . Этот код использует сериализацию по умолчанию для ключей и значений словаря, что полезно, когда у вас есть не строковые типы для обоих. Код использует наследование, чтобы делать свое дело (вы должны использовать этот подкласс для хранения ваших значений). Вы также можете использовать подход типа оболочки, как это было сделано в последнем пункте этой статьи , но обратите внимание, что код в этой статье просто использует ToString, поэтому вы должны объединить его с первой статьей.
Поскольку я согласен с Джоэлом в том, что StackOverflow является каноническим источником всего, ниже приведена копия кода из первой ссылки. Если вы заметили какие-либо ошибки, отредактируйте этот ответ!
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
TKey key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
TValue value = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
this.Add(key, value);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
foreach (TKey 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();
}
}
#endregion
}