bất cứ khi nào tôi cố gắng để serialize điển tôi nhận được ngoại lệ:Vấn đề với Json Serialize điển <Enum, Int32>
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 là:
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
}
}
Dĩ nhiên tôi có thể sử dụng ToString() bất cứ khi nào tôi nhập một cái gì đó vào từ điển nhưng kể từ khi nó được sử dụng khá thường xuyên trong các phương pháp hiệu suất có liên quan tôi muốn sử dụng enum.
Giải pháp duy nhất của tôi là sử dụng. ToString() và chuyển đổi trước khi vào khu vực quan trọng hiệu suất nhưng đó là vụng về và tôi sẽ phải thay đổi cấu trúc mã của mình chỉ để có thể tuần tự hóa dữ liệu.
Có ai có ý tưởng làm cách nào tôi có thể tuần tự hóa từ điển là <Enum, Int32>
không?
Tôi sử dụng System.Web.Script.Serialization.JavaScriptSerializer để tuần tự hóa.
UPDATE:
Tôi chuyển sang Dictionary<String, Int32>
bây giờ và nó hoạt động nhưng tôi hy vọng ai đó cho thấy một giải pháp như tôi không thực sự thích sử dụng chuỗi ở vị trí của một kiểu enum an toàn.
thể trùng lặp của (http: // stackoverflow.com/questions/5597349/how-do-i-convert-a-dictionary-to-a-json-string-in-c) –