我正在尝试移动一些代码以使用ASP.NET MVC Web API生成的Json数据而不是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 );
带有以下异常消息:
“无法创建类型为JsonSerializationExample.ISample的实例。类型是接口或抽象类,无法实例化。”
如果派生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方法来使序列化再次起作用。
有人可以协助吗?
这是首先解决问题的“正确”方法吗?
CanWrite
并返回false
。请参阅如何在自定义JsonConverter中使用默认序列化。