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
Répondre
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.
dev.e.loper est presque juste. Vous pouvez utiliser un List<Pair>
.
Vous pouvez également utiliser List<KeyValuePair<TKey,TValue>>
.
MSDN Documentation:
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();
}
}
}
Vous pouvez hériter de KeyedCollection qui est sérialisable.
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.
- 1. qui interface une classe implémente?
- 2. Une classe qui implémente une interface qui prend un ENUM
- 3. Comment mapper IDictionary qui a une valeur IList?
- 4. Récupérer une liste d'objet qui implémente une interface donnée
- 5. Directives pour l'utilisation de IDictionary (.NET)
- 6. Serveur Web Ruby-only (pour périphérique intégré)?
- 7. web intégré application mobile
- 8. Une classe qui implémente mouseLIstener et mouseMotionListener dans java
- 9. Comment approcher une classe qui implémente une interface et a une classe de base?
- 10. Objectif de l'interface IDictionary
- 11. Recherche de site intégré pour une application flash
- 12. Alternative aux images 0px (alias web beacons)
- 13. Comment puis-je exiger qu'un paramètre générique soit une énumération qui implémente une interface?
- 14. Une très bonne RichTextBox alternative pour
- 15. Comment sérialiser IDictionary
- 16. Pouvez-vous recommander une pile d'applications Web alternative?
- 17. IDictionary et Connection.RetrieveStatistics .NET/C#
- 18. Création d'une instance d'une classe qui implémente l'interface générique
- 19. Comment appeler une méthode de service Web?
- 20. XQuery comme alternative à JSP/Java pour les services Web?
- 21. IDictionary à SelectList?
- 22. VB to C# Traduire gestionnaire d'événements qui implémente l'événement d'interface
- 23. LINQ, entité qui implémente l'interface et l'exception dans le mappage
- 24. Alternative à innerhtml qui inclut l'en-tête?
- 25. Comment créer une classe Java qui implémente une interface avec deux types génériques?
- 26. Existe-t-il une alternative à SVCUTIL.EXE pour générer des proxys de service Web WCF?
- 27. Filtre IDictionary (De TK, TV) à un IDictionary (De TK, TV) avec linq
- 28. Comment appeler une méthode qui est une valeur de hachage?
- 29. Bonne alternative pour ASpell?
- 30. Le passage d'une classe dérivée à une méthode de service Web qui prend un type abstrait
Pourquoi ne pas utiliser les dictionnaires et pourquoi éviter délibérément d'écrire un cours sérialisé? – Juliet
Vous ne pouvez pas utiliser un type qui hérite de IDictionary en tant que type de retour de méthode Web – Vnuk