Класс 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, чтобы сериализация снова заработала.
Кто-нибудь может помочь?
Является ли это "правильным"? способ решить проблему в первую очередь?