каждый раз, когда я пытаюсь сериализировать словарь, я получаю исключение:
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>
?
Я использую Систему. Сеть. Сценарий. Сериализация. JavaScriptSerializer для сериализации.
ОБНОВЛЕНИЕ:
Я переключился на Dictionary<String, Int32>
теперь и это работает, но я надеюсь, что кто-то показывает решение, поскольку мне действительно не нравится использовать строки вместо безопасного с точки зрения типов перечисления.
Я думаю, что у вас проблемы, потому что TestEnum
объявлен как частное перечисление
. Попробуйте пометить его как публичное перечисление
. Сериализатору необходимо найти ваше перечисление через отражение, чтобы сериализовать его.
Также согласно Docs , перечисления должны иметь целочисленные значения. Так что вы можете написать:
public enum TestEnum { A = 1, B = 2, C =3 }
Кроме того, в документации говорится, что это перечисление будет просто сопоставлено с соответствующим целочисленным значением во время сериализации. Итак, в зависимости от того, что вы делаете на другом конце, String
могут быть более выразительными и более простыми для работы.
Исключение сказано «ключи должны быть строками или объектами», так что попробуйте
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.A));
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.B));
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.C));
Я не тестировал это, просто предположение.