всякий раз, когда я пытаюсь сериализовать словарь, я получаю исключение:
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 для сериализации.
UPDATE:
Теперь я переключился на Dictionary<String, Int32>
, и он работает, но я надеюсь, что кто-то покажет решение, поскольку мне не очень нравится использовать строки вместо безопасного переименования типа.