4

オブジェクトのデシリアライズに問題があります。次のプロパティが含まれています。

public List<IShape> Shapes { get; set; };

また、JSON.NET デシリアライザーは、インターフェイスをインスタンス化できないことを常に教えてくれます。

IShape インターフェイスを実装するインターフェイスを実装するクラスがいくつかありますPolyline -> IPolyline -> IShape。私はすでに2つの解決策を試しました:

しかし、IShape をインスタンス化できないという同じ例外がスローされました。

上記でリンクした投稿に記載されているコンバーターを使用しても、オブジェクトを でシリアル化しますTypeNameHandling.AutoTypeNameHandling.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 であり、それ以外のものではありません...

4

3 に答える 3

2

デシリアライザーはハイドレート時にインターフェイスが表す具体的な型を認識していないため、例外は理にかなっています。

シリアル化中に、JSON.NET を構成して、この場合に使用されるメタデータを追加できます。 This SO questionには、構成方法を説明する回答があります。

この構成により、逆シリアル化中に使用される JSON に type プロパティが追加されます。

于 2013-03-14T12:02:26.850 に答える