всякий раз, когда я пытаюсь сериализовать словарь, я получаю исключение:
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 () всякий раз, когда вводил что-то в словарь, но так как это довольно часто используется в методах, связанных с производительностью, я бы предпочел использовать enum.
Моим единственным решением является использование .ToString () и преобразование перед входом в критические области производительности, но это неуклюже, и мне придется изменить структуру кода, чтобы иметь возможность сериализовать данные.
Кто-нибудь знает, как я мог бы сериализовать словарь как <Enum, Int32>
?
Я использую System.Web.Script.Serialization.JavaScriptSerializer для сериализации.
UPDATE:
Я перешел на Dictionary<String, Int32>
сейчас, и это работает, но я надеюсь, что кто-то покажет решение, так как я не очень люблю использовать строки вместо перечисления типа safe.