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
Antwort
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.
dev.e.loper ist fast richtig. Sie können eine List<Pair>
verwenden.
Alternativ können Sie List<KeyValuePair<TKey,TValue>>
verwenden.
MSDN Dokumentation:
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();
}
}
}
Sie können von KeyedCollection erben, das Serializable ist.
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.
- 1. Alternative zur Verwendung von Eval in Javascript
- 2. Verwendung von Referenzparameter für eine Webmethode in .NET
- 3. Alternative zur Verwendung von udevadm Befehl
- 4. Alternative zur Verwendung mehrerer FloatingActionButtons?
- 5. Gibt es eine Alternative zur Verwendung von sun.jdbc.odbc.JdbcOdbcDriver?
- 6. Gibt es eine konfigurierbare Alternative zur Verwendung von @Version?
- 7. Django: Alternative zur Verwendung von Annotate (Count()) für Geschwindigkeit
- 8. Gibt es eine Alternative zur Verwendung von Minus in px
- 9. Alternative zur statischen Klasse für zustandslose Objekte
- 10. Ruby Alternative zur Verwendung von Klassenvariablen in ActiveSupport :: Concern
- 11. Alternative zu CasperJS zur Verwendung mit Cucumber.js
- 12. Alternative zur Ausführung dynamischer SQL
- 13. Alternative zur Verwendung der Beziehung mit SQLite
- 14. Gibt es eine Alternative zur Verwendung mehrerer UND-Operatoren?
- 15. Überschreiben von ToString für ein Objekt zur Verwendung in DataBinding
- 16. Alternative zur Verwendung von ng-init in 'view'?
- 17. Was ist eine Alternative für die Verwendung von com.nineoldandroids Bibliothek
- 18. AJAX Alternative zur Verwendung von jQuery Form ui
- 19. Testen, ob ein Objekt eine generische Schnittstelle für einen generischen Typ implementiert
- 20. Testflug Alternative zur Produktion
- 21. Alternative zur Verwendung einer Entität als Parameter für eine Aufrrichtmethode in WCF RIA Services
- 22. PHP - Alternative zur Verwendung innerhalb einer Schleife enthalten
- 23. Wie erstelle ich ein Objekt, das eine Schnittstelle implementiert?
- 24. PHP Alternative zur Verwendung einer Abfrage innerhalb einer Schleife
- 25. Hat Chrome das dataTransfer-Objekt falsch implementiert?
- 26. Erweiterungsmethoden für IDictionary und IReadOnlyDictionary
- 27. Idiomatische Alternative zur Reflexion
- 28. Gibt es eine Alternative zur Verwendung von static_cast <int> die ganze Zeit?
- 29. Gibt es eine generische Alternative zur ListDictionary-Klasse?
- 30. Wie generisches Objekt in Java implementiert wird, implementiert eine Schnittstelle
Warum können Sie keine Wörterbücher verwenden und warum würden Sie absichtlich vermeiden, eine serialisierte Klasse zu schreiben? – Juliet
Sie können keinen Typ verwenden, der von IDictionary als Rückgabetyp für Webmethoden erbt – Vnuk