Как возвратить универсальный словарь в WebService

Альтернативой найденному вами решению является создание файла nuget.config, удаляющего все источники nuget:

<configuration>
 <packageSources>
    <clear />
 </packageSources>
</configuration>

Таким образом, для восстановления не нужно использовать специальные аргументы командной строки или построить.

27
задан Samuel 24 March 2009 в 20:28
поделиться

4 ответа

Эта статья имеет метод для сериализации IDictionaries. Ищите "я заметил, что XmlSerializer не сериализирует объекты та реализация IDictionary по умолчанию. Есть ли какой-либо путь вокруг этого?" о 2/3 путь ниже на страницу.

5
ответ дан Moose 28 November 2019 в 05:21
поделиться

Создайте тип MyKeyValuePair<K,V>, и возвратите a List<MyKeyValuePair<int,string>>, скопированный со словаря.

7
ответ дан John Saunders 28 November 2019 в 05:21
поделиться

Я использую этот util класс для сериализации словарей, возможно, это может быть полезно для Вас

using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace Utils {
    ///<summary>
    ///</summary>
    public class SerializableDictionary : IXmlSerializable {
        private readonly IDictionary<int, string> dic;
        public DiccionarioSerializable() {
            dic = new Dictionary<int, string>();
        }
        public SerializableDictionary(IDictionary<int, string> dic) {
            this.dic = dic;
        }
        public IDictionary<int, string> Dictionary {
            get { return dic; }
        }
        public XmlSchema GetSchema() {
            return null;
        }
        public void WriteXml(XmlWriter w) {
            w.WriteStartElement("dictionary");
            foreach (int key in dic.Keys) {
                string val = dic[key];
                w.WriteStartElement("item");
                w.WriteElementString("key", key.ToString());
                w.WriteElementString("value", val);
                w.WriteEndElement();
            }
            w.WriteEndElement();
        }
        public void ReadXml(XmlReader r) {
            if (r.Name != "dictionary") r.Read(); // move past container
            r.ReadStartElement("dictionary");
            while (r.NodeType != XmlNodeType.EndElement) {
                r.ReadStartElement("item");
                string key = r.ReadElementString("key");
                string value = r.ReadElementString("value");
                r.ReadEndElement();
                r.MoveToContent();
                dic.Add(Convert.ToInt32(key), value);
            }
        }
    }
}
4
ответ дан 28 November 2019 в 05:21
поделиться

Не существует "стандартного" способа взять Словарь и преобразовать его в 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
}
25
ответ дан 28 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: