2009-05-16 4 views
2

J'ai une application Web qui utilise le service Web créé dans ASP.NET. Dans ce service Web, je souhaite transmettre un objet de collection de type Key Value (c'est-à-dire quelque chose comme Hashtable ou Dictionay).

Mais nous ne pouvons pas utiliser les objets implémentés depuis IDictionary.

Je ne souhaite pas créer de classe sérialisée dans mon service Web.

Quelqu'un peut-il me suggérer la meilleure approche pour cela?Alternative d'utilisation de l'objet intégré qui implémente IDictionary pour une méthode Web

+2

Pourquoi ne pas utiliser les dictionnaires et pourquoi éviter délibérément d'écrire un cours sérialisé? – Juliet

+0

Vous ne pouvez pas utiliser un type qui hérite de IDictionary en tant que type de retour de méthode Web – Vnuk

Répondre

0

Vous pouvez essayer d'utiliser 2 tableaux, 1 pour les clés et un pour les valeurs, où les index des tableaux correspondent. Pas la solution la plus idéale mais valide. Les internes du webservice vous pouvez utiliser IDictionary et juste passer les clés et les valeurs de cet objet.

3

dev.e.loper est presque juste. Vous pouvez utiliser un List<Pair>.

Vous pouvez également utiliser List<KeyValuePair<TKey,TValue>>.

MSDN Documentation:

1

Je ne suis pas tout à fait clair sur votre question, mais peut-être vous besoin de quelque chose comme ça?

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

[XmlRoot("dictionary")] 
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable 
{ 
    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     var keySerializer = new XmlSerializer(typeof(TKey)); 
     var 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"); 
      var key = (TKey)keySerializer.Deserialize(reader); 
      reader.ReadEndElement(); 

      reader.ReadStartElement("value"); 
      var value = (TValue)valueSerializer.Deserialize(reader); 
      reader.ReadEndElement(); 

      this.Add(key, value); 
      reader.ReadEndElement(); 
      reader.MoveToContent(); 
     } 

     reader.ReadEndElement(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     var keySerializer = new XmlSerializer(typeof(TKey)); 
     var valueSerializer = new XmlSerializer(typeof(TValue)); 

     foreach (var 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(); 
     } 
    } 
} 
1

Je résolu ce problème en utilisant DictionaryEntry

La seule différence est que la clé est l'objet aussi bien.

J'ai fondamentalement un Dictionary ToDictionary(DictionaryEntry[] entries) et un DictionaryEntry[] FromDictionary(Dictionary entries) méthodes statiques qui sont très légères et finissent par me faire au même endroit sans avoir à faire ma propre classe de collection.

L'avantage supplémentaire est que le XML qui en résulte est plus proche de celui que les services Web WCF utilisent par défaut! Cela signifie que vous pouvez effectuer ce changement maintenant dans votre code client et être prêt pour le WCF si vous décidez de vous déplacer de cette façon.

Le résultat ressemble à ceci sur JSON [{"Key": key1, "Value": value1}, {"Key": key2, "Value": value2}] exactement le même que sur WCF par défaut.

Questions connexes