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?

questionAnswers(7)

yourAnswerToTheQuestion