2010-05-31 8 views
0

J'ai essayé de transmettre un dictionnaire via WebServices. Cependant, il n'est pas sérialisable. j'ai donc écrit une classe propre qui le rend serializeable:Utilisation de dictionnaires avec 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 
      } 
     } 
    } 
} 

Cependant, je reçois un ArrayOfXElement retour. Existe-t-il un moyen de le renvoyer à un dictionnaire? accueille

Répondre

0

Si vous utilisez Visual Studio pour générer vos proxies de service, vous pouvez modifier les types de données générés en appuyant sur le bouton "Avancé". Par exemple, vous pouvez mapper des types de collection à une liste générique ou à une collection observable, et pour les dictionnaires, vous pouvez essentiellement dire de les mapper à différents types de données.

Cela devrait vous aider.

+0

salut thx pour le ansere mais j'ai encore quelques problèmes: maintenant en faisant: Service des mentions-> nouvelle référence de service -> choisir-> avancé i obtenir un menu, où je peux mapper le dictionnaire des listes ou des tableaux . Je veux obtenir un dictionnaire en arrière ... J'ai eu une erreur avec non sérialisable – Umit