Problèmes avec Json Serialize Dictionary & lt; Enum, Int32 & gt;
chaque fois que j'essaie de sérialiser le dictionnaire-je obtenir de l'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
Mon cas de test est:
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
}
}
Bien sûr que je pourrais utiliser .ToString() à chaque fois que je entrez quelque chose dans le Dictionnaire, mais depuis il est utilisé assez souvent dans les performances des méthodes que je préfère, à l'aide de l'enum.
Ma seule solution est d'utiliser .ToString() et de la conversion avant d'entrer dans la critique pour les performances régions, mais c'est maladroit et je dois changer ma structure de code juste pour être en mesure de sérialiser les données.
Quelqu'un a une idée de comment je pourrais arranger le dictionnaire comme <Enum, Int32>
?
- Je utiliser le Système.Web.Script.La sérialisation.JavaScriptSerializer pour la sérialisation.
Mise à JOUR:
Je suis passé à Dictionary<String, Int32>
maintenant et il fonctionne, mais j'espère que quelqu'un montre une solution que je n'aime pas utiliser des chaînes de caractères à la place d'un type de coffre-fort enum.
source d'informationauteur dbemerlin
Vous devez vous connecter pour publier un commentaire.
Je sais il est tard, mais peut-être quelqu'un d'autre peut faire usage à l'avenir. Vous pouvez obtenir ce dont vous avez besoin à l'aide de LINQ:
Utilisation Newtonsoft (Newtonsoft.Json.dll) pour sérialiser l'objet du Dictionnaire et vous serez amende. C'est un tiers populaires de la bibliothèque vous aurez à télécharger et à inclure dans votre projet en tant que référence.
Voir l'exemple ci-dessous:
Je pense que vous êtes d'avoir des ennuis parce que
TestEnum
est déclaré comme unprivate enum
. Essayez en le marquant comme unpublic enum
. Le processus doit être en mesure de trouver votre enum par la réflexion afin de sérialiser.Aussi en fonction de l' Docsles enums doivent avoir des valeurs entières. Donc, vous pourriez écrire:
Aussi, les docs disent que ce enum ne mappée à sa valeur entière correspondant au cours de la sérialisation. Donc, en fonction de ce que vous faites sur l'autre extrémité,
String
s pourrait être plus expressif et plus facile de travailler avec.Exception dit "clés doivent être des chaînes de caractères ou d'un objet" donc, essayez
Je n'ai pas de test bien, juste une supposition.
J'ai créé JavaScriptSerializer extension DeserializeDictionary - voir http://geekswithblogs.net/mnf/archive/2011/06/03/javascriptserializer-extension-deserializedictionarytkey-tvalue.aspx