Mor*_*dur 13 c# serialization json dictionary
每当我尝试序列化字典时,我都会得到异常:
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
Run Code Online (Sandbox Code Playgroud)
我的测试用例是:
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
}
}
Run Code Online (Sandbox Code Playgroud)
当然,每当我在词典中输入内容时,我都可以使用.ToString(),但由于它在性能相关的方法中经常使用,我更喜欢使用枚举.
我唯一的解决方案是在进入性能关键区域之前使用.ToString()和转换,但这很笨拙,我不得不改变我的代码结构只是为了能够序列化数据.
有谁知道如何将字典序列化为<Enum, Int32>?
我使用System.Web.Script.Serialization.JavaScriptSerializer进行序列化.
更新:
我切换到Dictionary<String, Int32>现在,它的工作原理,但我希望有人显示解决方案,因为我不喜欢使用字符串代替类型安全枚举.
Mic*_* B. 18
我知道现在已经很晚了,但也许其他人可以在将来使用它.您可以使用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);
Run Code Online (Sandbox Code Playgroud)
使用Newtonsoft(Newtonsoft.Json.dll)序列化Dictionary对象,你会没事的.这是一个受欢迎的第三方库,您必须下载并包含在您的项目中作为参考.
见下面的例子:
var _validationInfos = new Dictionary<ImportField, ValidationInfo>();
var serializedData = JsonConvert.SerializeObject(_validationInfos);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10887 次 |
| 最近记录: |