Класс NewtonSoft.Json Serialize and Deserialize со свойством типа IEnumerable <ISomeInterface>

Я пытаюсь переместить некоторый код для использования данных Json, созданных веб-API ASP.NET MVC, вместо SOAP Xml.

Я столкнулся с проблемой с сериализацией и десериализацией свойств типа:

IEnumerable<ISomeInterface>.

Вот простой пример:

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

Я могу легко сериализовать экземпляры SampleGroup с помощью:

var sz = JsonConvert.SerializeObject( sampleGroupInstance );

Однако соответствующая десериализация завершается неудачно:

JsonConvert.DeserializeObject<SampleGroup>( sz );

с этим сообщением об исключении:

& quot; Не удалось создать экземпляр типа JsonSerializationExample.ISample. Тип является интерфейсом или абстрактным классом и не может быть создан. & Quot;

Если я получу JsonConverter, я могу украсить свою собственность следующим образом:

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

Вот 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?
  }
}

Этот конвертер решает проблему десериализации, но я не могу понять, как кодировать метод WriteJson, чтобы сериализация снова заработала.

Кто-нибудь может помочь?

Является ли это "правильным"? способ решить проблему в первую очередь?

Ответы на вопрос(7)

Ваш ответ на вопрос