SOAP Xml の代わりに、ASP.NET MVC Web API で生成された Json データを使用するようにコードを移動しようとしています。
次のタイプのプロパティのシリアル化と逆シリアル化で問題が発生しました。
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 メソッドをコーディングする方法がわかりません。
誰でも手伝ってもらえますか?
これは、そもそも問題を解決するための「正しい」方法ですか?