2010-05-31 3 views
0

Я попытался передать словарь через WebServices. Однако это не сериализуемо. Так я написал собственный класс, который делает его serializeable:с использованием словарей с 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 назад. Есть ли способ вернуть его в словарь? приветствует

ответ

0

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

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

+0

привет ТНХ для ansere, но я до сих пор есть некоторые проблемы: сейчас, выполнив: сервиса references-> новой ссылку сервиса -> choose-> расширенного я получаю меню, где я могу сопоставить словарь для списков или массивов , Но я хочу получить словарь обратно ... У меня ошибка с не сериализуемым, поэтому я написал класс выше, но теперь я получаю arrayofxelement – Umit

Смежные вопросы