问题Json序列化字典<枚举,Int32> [英] Problems with Json Serialize Dictionary<Enum, Int32>

查看:179
本文介绍了问题Json序列化字典<枚举,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序列化字典&lt;枚举,Int32&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆