использование словарей с WebServices - PullRequest
0 голосов
/ 31 мая 2010

Я пытался передать словарь через WebServices. Однако это не сериализуемо. Поэтому я написал собственный класс, который делает его сериализуемым:

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

namespace Platform
{
    public class SaDictionary<TKey, TValue> : Dictionary<TKey, TValue>,
                                              IXmlSerializable
    {
        #region Constructors
        public SaDictionary() : base() { }

        public SaDictionary(IDictionary<TKey, TValue> dictionary)
            : base(dictionary)  {  }

        public SaDictionary(IEqualityComparer<TKey> comparer)
            : base(comparer)  {  }

        public SaDictionary(int capacity)
            : base(capacity)  {  }

        public SaDictionary(IDictionary<TKey, TValue> dictionary,
                            IEqualityComparer<TKey> comparer)
            : base(dictionary, comparer)  {  }

        public SaDictionary(int capacity, IEqualityComparer<TKey> comparer)
            : base(capacity, comparer)  {  }

        //protected SaDictionary(SerializationInfo info,
        //                       StreamingContext context)
        //    : base(info, context)
        //{
        //}
        #endregion

        public XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(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 != XmlNodeType.EndElement)
            {
                reader.ReadStartElement("item");
                reader.ReadStartElement("key");
                TKey key = (TKey)keySerializer.Deserialize(reader);
                reader.ReadEndElement(); //key

                reader.ReadStartElement("value");
                TValue value = (TValue)valueSerializer.Deserialize(reader);
                reader.ReadEndElement(); //value
                this.Add(key, value);

                reader.ReadEndElement(); //item
                //   reader.MoveToContent();
            }
            reader.ReadEndElement();
        }

        public void WriteXml(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(); //key
                writer.WriteStartElement("value");
                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement(); //value
                writer.WriteEndElement(); //item
            }
        }
    }
}

Однако я вернул ArrayOfXElement. Есть ли способ вернуть его в словарь? приветствует

1 Ответ

0 голосов
/ 31 мая 2010

Если вы используете Visual Studio для генерации прокси-служб, то при нажатии кнопки «Дополнительно» вам будут предложены варианты изменения сгенерированных типов данных. Например, вы можете сопоставить типы коллекций с универсальным списком или наблюдаемой коллекцией, а для словарей вы можете, по сути, указать ей сопоставление с различными типами данных.

Это должно вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...