Tengo una clase de colección que implementa IEnumerable y estoy teniendo problemas para deserializar una versión serializada de la misma. Estoy usando Json.net v 4.0.2.13623serialización Json.net de colección personalizada implementando IEnumerable <T>
Aquí es una versión más simple de mi clase de colección que ilustra mi problema
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
}
}
Cuando serializarlo me sale el siguiente JSON
[
{
"Number": 1
},
{
"Number": 2
}
]
Pero cuando trato de deserializar recibo la siguiente excepción System.Exception: No se puede crear y poblar la lista tipo MyTypes
Have also t Ried uso de sugerencias de serialización, pero no han tenido éxito
Estos son la función de prueba que he utilizado
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);
}
nadie ha logrado serializar sus propios objetos de colección?
Gracias de antemano
Pat
Debe serializar y deserializar colecciones concretas como la Lista en lugar de IEnumerable . Para deserializar algo, necesita una implementación en lugar de solo una interfaz. –
Deleted
Chris, alterado a la subclase ReadOnlyCollection con algunos otros cambios, pero puedo saber deserializar la colección –
pmcgrath
En realidad, también se puede usar un IList. Creará una Lista para usted. Pero no hay una colección predeterminada definida para IEnumerable . –
Mithon