2008-09-17 5 views
73

Ich bin auf der Suche nach einem Schlüssel/Wert-Paar-Objekt, das ich in einen Webdienst aufnehmen kann.Gibt es in .NET eine serialisierbare generische Schlüssel/Wert-Paarklasse?

Ich habe versucht mit .NET System.Collections.Generic.KeyValuePair<> Klasse, aber es nicht ordnungsgemäß in einem Webdienst serialisieren. In einem Webdienst werden die Schlüssel- und Werteigenschaften nicht serialisiert, wodurch diese Klasse nutzlos wird, es sei denn, jemand kennt eine Möglichkeit, dies zu beheben.

Gibt es eine andere generische Klasse, die für diese Situation verwendet werden kann?

Ich würde .NET System.Web.UI.Pair Klasse verwenden, aber es verwendet Objekt für seine Typen. Es wäre nett, eine generische Klasse zu verwenden, wenn auch nur für die Typsicherheit.

Antwort

87

Definieren Sie einfach eine Struktur/Klasse.

[Serializable] 
public struct KeyValuePair<K,V> 
{ 
    public K Key {get;set;} 
    public V Value {get;set;} 
} 
+5

Einfach. Wenn Sie aufhören und darüber nachdenken ... – Paddy

+3

@Paddy: Wissen, wie valuetypes gehashed und Vergleich der Gleichheit ist ein Muss – leppie

+2

IDictionary ist jetzt serializable, in 4,5 (zumindest mit JSON) – tomg

20

Ich glaube nicht, dass es als Dictionary<> selbst nicht XML serialisierbar ist, wenn ich ein Dictionary-Objekt über einen Web-Service senden hatte muss ich die Dictionary<> Objekt selbst Einwickeln beendet und das Hinzufügen der Unterstützung für IXMLSerializable.

+5

OP erwähnt Wörterbuch überhaupt nicht. Die Frage ist über Serialisierung eines Schlüssel/Wertpaares. Ihre Antwort ist in Verbindung stehend , aber ich denke, dass es von dem grundlegenden Problem ablenkt. –

0

Eine KeyedCollection ist eine Art Wörterbuch, das direkt ohne Probleme in xml serialisiert werden kann. Das einzige Problem ist, dass Sie auf Werte zugreifen müssen: coll ["key"]. Value;

+0

Ich denke nicht, dass KeyedCollection in einem ** WebService ** serialisiert werden kann, da es keinen öffentlichen Konstruktor hat. Das [Serializable] -Attribut funktioniert nur für Remoting. – Martin

16

Sie den Grund finden, warum KeyValuePairs nicht an dieser MSDN Blog Post serialisiert werden kann

STRUCT Antwort ist die einfachste Lösung, aber nicht die einzige Lösung. Eine "bessere" Lösung besteht darin, eine Custom KeyValurPair-Klasse zu schreiben, die serialisierbar ist.

+9

Beachten Sie, dass der DataContractSerializer (wie es mit .NET 3.0 und WCF kommt) KeyValuePair 01 einwandfrei verarbeiten kann.Es handelt sich also nicht um ein generelles Serialisierungsproblem, sondern um ein Problem mit dem spezifischen Serializer, den Sie verwenden (wie der Link zur MSDN-Seite vermuten lässt). –

1

Im 4.0 Framework gibt es auch die Tuple-Familie von Klassen, die serialisierbar und gleichsetzbar sind. Sie können Tuple.Create(a, b) oder new Tuple<T1, T2>(a, b) verwenden.

+16

Während die Tuple-Typen serialisierbar sind, sind sie leider nicht XML Serializable – Cheetah

-3

können Sie verwenden Tuple<string,object>

dies auf Tuple Nutzung für weitere Details zu sehen: Working with Tuple in C# 4.0

+15

Dies war [bereits vorgeschlagen] (http://stackoverflow.com/questions/83232/is-there-a-serializable-generic-key-value-pair- Klasse-in-Netz/4598558 # 4598558). Leider ist die Tuple-Klasse nicht XML-serialisierbar. –

+0

Danke Dan Herbert –

5
[Serializable] 
public class SerializableKeyValuePair<TKey, TValue> 
    { 

     public SerializableKeyValuePair() 
     { 
     } 

     public SerializableKeyValuePair(TKey key, TValue value) 
     { 
      Key = key; 
      Value = value; 
     } 

     public TKey Key { get; set; } 
     public TValue Value { get; set; } 

    } 
Verwandte Themen