オブジェクトのデシリアライズに問題があります。次のプロパティが含まれています。
public List<IShape> Shapes { get; set; };
また、JSON.NET デシリアライザーは、インターフェイスをインスタンス化できないことを常に教えてくれます。
IShape インターフェイスを実装するインターフェイスを実装するクラスがいくつかありますPolyline -> IPolyline -> IShape
。私はすでに2つの解決策を試しました:
しかし、IShape をインスタンス化できないという同じ例外がスローされました。
上記でリンクした投稿に記載されているコンバーターを使用しても、オブジェクトを でシリアル化しますTypeNameHandling.Auto
。TypeNameHandling.All
この問題の解決策を知っている人はいますか? コードが必要な場合は、喜んで投稿します。
生成される JSON のサンプルを次に示します。
"$type": "SketchModel.Layer, SketchModel",
"Id": 57865477,
"Shapes": {
"$type": "System.Collections.Generic.List`1[[SketchModel.Shapes.AbstractShapes.IShape, SketchModel]], mscorlib",
"$values": [
{
"$type": "SketchModel.Shapes.Polyline, SketchModel",
この行が問題の原因です。
"System.Collections.Generic.List`1[[SketchModel.Shapes.AbstractShapes.IShape, SketchModel]], mscorlib"
IShape をインスタンス化する方法がわからないだけです。カスタム コンバーターを作成し、各 IShape のポリラインを返すようにすると、機能しますが、他の形状 (楕円など) は作成されません。
カスタム コンバーターでオーバーライドされる
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
メソッドで、objectType の完全な型名を出力させた場合、それは常に IShape であり、それ以外のものではありません...