2009-05-16 5 views
2

Ich habe eine Webanwendung, die den in ASP.NET erstellten Webdienst verwendet. In diesem Webdienst möchte ich ein Sammlungsobjekt vom Schlüsselwerttyp übergeben (d. H. Etwas wie Hashtable oder Dictionay).

Aber wir können keine Objekte verwenden, die IDictionary implementiert.

Ich möchte keine serialisierte Klasse in meinem Webdienst erstellen.

Kann mir jemand den besten Ansatz dafür vorschlagen?Alternative zur Verwendung von integriertem Objekt, das IDictionary für eine Webmethode implementiert

+2

Warum können Sie keine Wörterbücher verwenden und warum würden Sie absichtlich vermeiden, eine serialisierte Klasse zu schreiben? – Juliet

+0

Sie können keinen Typ verwenden, der von IDictionary als Rückgabetyp für Webmethoden erbt – Vnuk

Antwort

0

Sie könnten versuchen, 2 Arrays zu verwenden, 1 für Schlüssel und 1 für Werte, wobei die Indizes der Arrays übereinstimmen. Nicht die ideale Lösung, sondern eine gültige Lösung. In den Interna des Webservice können Sie IDictionary verwenden und die Schlüssel und Werte dieses Objekts einfach ausgeben.

3

dev.e.loper ist fast richtig. Sie können eine List<Pair> verwenden.

Alternativ können Sie List<KeyValuePair<TKey,TValue>> verwenden.

MSDN Dokumentation:

1

ich auf Ihre Frage nicht ganz klar bin, aber vielleicht sind Sie so etwas wie dieses benötigen?

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

Ich löste dies durch Dictionary mit

Der einzige Unterschied besteht darin, dass Key-Objekt als gut.

Ich habe grundsätzlich eine Dictionary ToDictionary(DictionaryEntry[] entries) und eine DictionaryEntry[] FromDictionary(Dictionary entries) statische Methoden, die sehr geringes Gewicht sind und am Ende zu mir kommen, ohne meine eigene Sammelklasse zu machen.

Der zusätzliche Vorteil ist, dass das XML, das als Ergebnis kommt, näher an dem ist, in dem die WCF-Webdienste standardmäßig verwendet werden! Das bedeutet, dass Sie diese Änderung jetzt in Ihrem Client-Code vornehmen und für WCF bereit sein können, wenn Sie sich auf diese Weise entscheiden. Das Ergebnis sieht über JSON [{"Key": key1, "Value": value1}, {"Key": key2, "Value": value2}] genauso aus wie über WCF standardmäßig.

Verwandte Themen