NewtonSoft.Json Serialize and Deserialize class o właściwościach typu IEnumerable <ISomeInterface>
Próbuję przenieść jakiś kod, aby konsumować ASP.NET MVC Web API wygenerowane dane Json zamiast SOAP Xml.
Wystąpił problem z serializacją i deserializacją właściwości typu:
IEnumerable<ISomeInterface>.
Oto prosty przykład:
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; }
}
}
Mogę łatwo serializować wystąpienia SampleGroup za pomocą:
var sz = JsonConvert.SerializeObject( sampleGroupInstance );
Jednak odpowiedni deserializacja nie powiedzie się:
JsonConvert.DeserializeObject<SampleGroup>( sz );
z tym komunikatem wyjątku:
„Nie można utworzyć instancji typu JsonSerializationExample.ISample. Typ to klasa interfejsu lub abstrakcyjna i nie można jej utworzyć.”
Jeśli otrzymam JsonConverter, mogę ozdobić moją własność w następujący sposób:
[JsonConverter( typeof (SamplesJsonConverter) )]
public IEnumerable<ISample> Samples { get; set; }
Oto 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?
}
}
Ten konwerter rozwiązuje problem deserializacji, ale nie mogę zrozumieć, jak kodować metodę WriteJson, aby serializacja działała ponownie.
Czy ktoś może pomóc?
Czy jest to „poprawny” sposób na rozwiązanie problemu?