NewtonSoft.Json Serialize- und Deserialize-Klasse mit der Eigenschaft IEnumerable <ISomeInterface>

Ich versuche, Code zu verschieben, um die von ASP.NET MVC Web API generierten Json-Daten anstelle von SOAP Xml zu verwenden.

Ich habe ein Problem mit der Serialisierung und Deserialisierung von Eigenschaften des Typs festgestellt:

IEnumerable<ISomeInterface>.

Hier ist ein einfaches Beispiel:

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; }
 }
}

Ich kann Instanzen von SampleGroup einfach serialisieren mit:

var sz = JsonConvert.SerializeObject( sampleGroupInstance );

Die entsprechende Deserialisierung schlägt jedoch fehl:

JsonConvert.DeserializeObject<SampleGroup>( sz );

mit dieser Ausnahmemeldung:

"Konnte keine Instanz des Typs JsonSerializationExample.ISample erstellen. Type ist eine Schnittstelle oder abstrakte Klasse und kann nicht instanziiert werden."

Wenn ich einen JsonConverter habe, kann ich meine Immobilie wie folgt dekorieren:

[JsonConverter( typeof (SamplesJsonConverter) )]
public IEnumerable<ISample> Samples { get; set; }

Hier ist der 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?
  }
}

Dieser Konverter löst das Deserialisierungsproblem, aber ich kann nicht herausfinden, wie die WriteJson-Methode codiert wird, damit die Serialisierung wieder funktioniert.

Kann jemand helfen?

Ist dies ein "richtiger" Weg, um das Problem zu lösen?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage