NewtonSoft.Json clase de serialización y deserialización con propiedad de tipo IEnumerable <ISomeInterface>
Estoy tratando de mover algo de código para consumir ASP.NET MVC Web API generado datos Json en lugar de SOAP Xml.
Me he encontrado con un problema con la serialización y deserialización de las propiedades de tipo:
IEnumerable<ISomeInterface>.
Aquí hay un ejemplo simple:
public interface ISample{
int SampleId { get; set; }
}
public class Sample : ISample{
public int SampleId { get; set; }
}
public class SampleGroup{
public int GroupId { get; set; }
public IEnumerable<ISample> Samples { get; set; }
}
}
Puedo serializar instancias de SampleGroup fácilmente con:
var sz = JsonConvert.SerializeObject( sampleGroupInstance );
Sin embargo, la deserialización correspondiente falla:
JsonConvert.DeserializeObject<SampleGroup>( sz );
con este mensaje de excepción:
"No se pudo crear una instancia de tipo JsonSerializationExample.ISample. Type es una interfaz o clase abstracta y no se puede crear una instancia".
Si obtengo un JsonConverter puedo decorar mi propiedad de la siguiente manera:
[JsonConverter( typeof (SamplesJsonConverter) )]
public IEnumerable<ISample> Samples { get; set; }
Aquí está el JsonConverter:
public class SamplesJsonConverter : JsonConverter{
public override bool CanConvert( Type objectType ){
return ( objectType == typeof (IEnumerable<ISample>) );
}
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer ){
var jA = JArray.Load( reader );
return jA.Select( jl => serializer.Deserialize<Sample>( new JTokenReader( jl ) ) ).Cast<ISample>( ).ToList( );
}
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer ){
... What works here?
}
}
Este convertidor resuelve el problema de deserialización pero no puedo entender cómo codificar el método WriteJson para que la serialización vuelva a funcionar.
¿Alguien puede ayudar?
¿Es esta una forma "correcta" de resolver el problema en primer lugar?