Проблемы с Json Сериализируют Словарь <Перечисление, 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

Мой Тестовый сценарий:

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> теперь и это работает, но я надеюсь, что кто-то показывает решение, поскольку мне действительно не нравится использовать строки вместо безопасного с точки зрения типов перечисления.

13
задан Morfildur 23 May 2010 в 19:10
поделиться

2 ответа

Я думаю, что у вас проблемы, потому что TestEnum объявлен как частное перечисление . Попробуйте пометить его как публичное перечисление . Сериализатору необходимо найти ваше перечисление через отражение, чтобы сериализовать его.

Также согласно Docs , перечисления должны иметь целочисленные значения. Так что вы можете написать:

public enum TestEnum { A = 1, B = 2, C =3 }

Кроме того, в документации говорится, что это перечисление будет просто сопоставлено с соответствующим целочисленным значением во время сериализации. Итак, в зависимости от того, что вы делаете на другом конце, String могут быть более выразительными и более простыми для работы.

0
ответ дан 1 December 2019 в 21:51
поделиться

Исключение сказано «ключи должны быть строками или объектами», так что попробуйте

data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.A));
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.B));
data.Add(Enum.ToObject(typeof(TestEnum), TestEnum.C));

Я не тестировал это, просто предположение.

0
ответ дан 1 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: