【发布时间】:2011-02-22 23:44:09
【问题描述】:
每当我尝试序列化字典时,我都会遇到异常:
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
我的测试用例是:
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
}
}
当然,每当我在字典中输入某些内容时,我都可以使用 .ToString(),但由于它经常用于与性能相关的方法中,我更喜欢使用枚举。
我唯一的解决方案是使用 .ToString() 并在进入性能关键区域之前进行转换,但这很笨拙,我必须更改我的代码结构才能序列化数据。
有谁知道我如何将字典序列化为<Enum, Int32>?
我使用 System.Web.Script.Serialization.JavaScriptSerializer 进行序列化。
更新:
我现在切换到 Dictionary<String, Int32> 并且它可以工作,但我希望有人提出解决方案,因为我不太喜欢使用字符串来代替类型安全的枚举。
【问题讨论】:
标签: c# json serialization dictionary