Probleme mit Json zu Serialisieren, Wörterbücher<Enum Int32>
immer wenn ich versuche zu serialisieren, das Wörterbuch, bekomme ich die exception:
System.ArgumentException: Type
'System.Collections.Generic.Dictionary`2[[Foo.DictionarySerializationTest+TestEnum, Foo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'
is not supported for serialization/deserialization of a dictionary,
keys must be strings or object
Mein Testcase:
public class DictionarySerializationTest
{
public enum TestEnum { A, B, C }
//tried with numbers, too: public enum TestEnum { A = 1, B = 2, C = 3 }
public void SerializationTest()
{
Dictionary<TestEnum, Int32> data = new Dictionary<TestEnum, Int32>();
data.Add(TestEnum.A, 1);
data.Add(TestEnum.B, 2);
data.Add(TestEnum.C, 3);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String result = serializer.Serialize(data);
//Throws
}
public void SerializationToObjectTest()
{
Dictionary<object, Int32> data = new Dictionary<object, Int32>();
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.A), 1);
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.B), 2);
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.C), 3);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String result = serializer.Serialize(data);
//Throws
}
public void SerializationStringTest()
{
Dictionary<String, Int32> data = new Dictionary<String, Int32>();
data.Add(TestEnum.A.ToString(), 1);
data.Add(TestEnum.B.ToString(), 2);
data.Add(TestEnum.C.ToString(), 3);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String result = serializer.Serialize(data);
//Succeeds
}
}
Natürlich, die ich verwenden könnte .ToString() auf, wenn ich geben Sie etwas in das Wörterbuch, aber da es sehr oft verwendet in der performance-relevanten Methoden würde ich lieber mit dem enum.
Meine einzige Lösung .ToString() und die Konvertierung, bevor Sie in die performance-kritischen Regionen, aber das ist umständlich und ich würde meine code-Struktur nur in der Lage sein zu serialisieren der Daten.
Hat jemand eine Idee, wie ich konnte serialisieren, die das Wörterbuch als <Enum, Int32>
?
Ich das System nutzen.Web.Script.Serialisierung.JavaScriptSerializer für die Serialisierung.
UPDATE:
Wechselte ich zu Dictionary<String, Int32>
jetzt und es funktioniert, aber ich hoffe, jemand zeigt eine Lösung, wie ich weiß nicht wirklich, wie die Verwendung von Zeichenfolgen in Ort eine typsichere enum.
InformationsquelleAutor Morfildur | 2010-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß, es ist spät, aber vielleicht kann jemand anders machen, verwenden Sie es in der Zukunft. Sie können erreichen, was Sie brauchen, ist die Verwendung von LINQ:
Ich würde noch empfehlen Json.NET wie heißt es in der JavaScriptSerializer Klasse Dokumentation: msdn.microsoft.com/en-us/library/...
InformationsquelleAutor Michal B.
Verwenden Newtonsoft (Newtonsoft.Json.dll) zu serialisieren, die das Dictionary-Objekt, und Sie in Ordnung sein würde. Es ist eine beliebte Drittanbieter-Bibliothek, die Sie hätte zu herunterladen und in Ihr Projekt als Referenz.
Siehe Beispiel unten:
InformationsquelleAutor Kwex
Ich denke, dass Sie Probleme haben, weil
TestEnum
ist deklariert alsprivate enum
. Versuchen Sie es markieren alspublic enum
. Der serializer muss in der Lage sein zu finden Ihre enum-über Reflexion, um es zu serialisieren.Auch nach der Docs, Enumerationen, müssen ganzzahlige Werte haben. So möchten Sie vielleicht zu schreiben:
Auch die docs sagen, dass dieses enum wird nur erhalten, abgebildet auf die entsprechende integer-Wert während der Serialisierung. Also je nachdem, was Sie tun, auf der anderen Seite
String
s könnte ausdrucksstärker sein und einfacher, mit zu arbeiten.InformationsquelleAutor luke
Ausnahme, sagt "die Schlüssel müssen strings sein oder das Objekt," so versuchen
Habe ich nicht getestet, es aber nur eine Vermutung.
InformationsquelleAutor Ekin Koc
Habe ich JavaScriptSerializer Erweiterung DeserializeDictionary - siehe http://geekswithblogs.net/mnf/archive/2011/06/03/javascriptserializer-extension-deserializedictionarytkey-tvalue.aspx
InformationsquelleAutor