问题Json序列化字典<枚举,Int32> [英] Problems with Json Serialize Dictionary<Enum, Int32>
问题描述
每当我尝试序列化字典我得到例外:
System.ArgumentException:键入
'系统.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]]'
不支持序列化/反序列化字典,
键必须是字符串或对象
我的测试用例是:
public class DictionarySerializationTest
{
public enum TestEnum {A,B,C}
//尝试使用数字: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);
//抛出
}
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);
//抛出
}
public void SerializationStringTest()
{
字典< 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);
//成功
}
}
当然,我可以使用.ToString()每当我输入一些东西进入Dictionary,但是由于它在性能相关的方法中经常使用,我更喜欢使用枚举。
解决方案是在进入性能关键区域之前使用.ToString()和转换,但是这是笨拙的,我必须更改我的代码结构才能够序列化数据。
<有没有人有一个想法,我可以如何将序列化字典作为
<枚举,Int32>
? 请使用System.Web.Script.Serialization.JavaScriptSerializer进行序列化。
更新:
我切换到字典< String,Int32>
现在,它的工作原理,但我希望有人显示一个解决方案,因为我不喜欢使用字符串代替一个类型安全枚举。
我知道很晚了,但也许别人可以在将来使用它。您可以使用LINQ实现您需要的功能:
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();
字典<字符串的Int32> dataToSerialize = data.Keys.ToDictionary(p => p.ToString(),p => data [p]);
string dataSerialized = serializer.Serialize(dataToSerialize);
whenever i try to serialize the dictionary i get the 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
My Testcase is:
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
}
}
Of course i could use .ToString() whenever i enter something into the Dictionary but since it's used quite often in performance relevant methods i would prefer using the enum.
My only solution is using .ToString() and converting before entering the performance critical regions but that is clumsy and i would have to change my code structure just to be able to serialize the data.
Does anyone have an idea how i could serialize the dictionary as <Enum, Int32>
?
I use the System.Web.Script.Serialization.JavaScriptSerializer for serialization.
UPDATE:
I switched to Dictionary<String, Int32>
now and it works but i hope someone shows a solution as i don't really like using strings in place of a type safe enum.
I know it's late, but maybe someone else can make use of it in the future. You can achieve what you need using LINQ:
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();
Dictionary<string, Int32> dataToSerialize = data.Keys.ToDictionary(p => p.ToString(), p => data[p]);
string dataSerialized = serializer.Serialize(dataToSerialize);
这篇关于问题Json序列化字典<枚举,Int32>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!