Json.net сериализация пользовательской коллекции, реализующей IEnumerable

У меня есть класс коллекции, который реализует IEnumerable, и у меня проблемы с десериализацией его сериализованной версии. Я использую Json.net v 4.0.2.13623

Вот упрощенная версия моего класса коллекции, которая иллюстрирует мою проблему

public class MyType
{
  public int Number { get; private set; }
  public MyType(int number)
  {
    this.Number = number;
  }
}

public class MyTypes : IEnumerable<MyType>
{
  private readonly Dictionary<int, MyType> c_index;
  public MyTypes(IEnumerable<MyType> seed)
  {
    this.c_index = seed.ToDictionary(item => item.Number);
  }
  public IEnumerator<MyType> GetEnumerator()
  {
    return this.c_index.Values.GetEnumerator();
  }
  IEnumerator IEnumerable.GetEnumerator()
  {
    return this.GetEnumerator();
  }
  public int CustomMethod()
  {
    return 1;  // Just for illustration
  }
}

Когда я сериализую его, я получаю следующий json

[
  {
    "Number": 1
  },
  {
    "Number": 2
  }
]

Но затем, когда я пытаюсь десериализовать, я получаю следующее исключение System.Exception: невозможно создать и заполнить список типа MyTypes

Также пытались использовать подсказки сериализации, но безуспешно

Это тестовая функция, которую я использовал

public void RoundTrip()
{
  var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
  var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented);
  var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent);
}
public void RoundTripWithSettings()
{
  var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });

  var _serializationSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Arrays };
  var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented, _serializationSettings);
  var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent, _serializationSettings);
}

Кто-нибудь управлял сериализовать собственные объекты коллекции?

Заранее спасибо

Пэт

15
задан pmcgrath 27 September 2011 в 09:41
поделиться