10

YamlDotNetを使用して、次の YAML を逆シリアル化しようとしています。

Collection:
  - Type: TypeA
    TypeAProperty: value1
  - Type: TypeB
    TypeBProperty: value2

プロパティは、のType下のすべてのオブジェクトの必須プロパティですCollection。残りのプロパティはタイプに依存します。

これは私の理想的なオブジェクト モデルです。

public class Document
{
  public IEnumerable<IBaseObject> Collection { get; set; }
}

public interface IBaseObject
{
  public string Type { get; }
}

public class TypeAClass : IBaseObject
{
  public string Type { get; set; }
  public string TypeAProperty { get; set; }
}

public class TypeBClass : IBaseObject
{
  public string Type { get; set; }
  public string TypeBProperty { get; set; }
}

私の読書に基づいて、私の最善の策は、から派生したカスタム ノード デシリアライザーを使用することだと思いますINodeDeserializer。概念実証として、私はこれを行うことができます:

public class MyDeserializer : INodeDeserializer
{
  public bool Deserialize(IParser parser, Type expectedType, Func<IParser, Type, object> nestedObjectDeserializer, out object value)
  {
    if (expectedType == typeof(IBaseObject))
    {
      Type type = typeof(TypeAClass);
      value = nestedObjectDeserializer(parser, type);
      return true;
    }

    value = null;
    return false;
  }
}

私の問題は、Typeを呼び出す前に選択するを動的に決定する方法nestedObjectDeserializerです。

JSON.Net を使用すると、 を使用しCustomCreationConverter、サブ JSON を に読み込み、タイプを決定してから、 からJObject新しい を作成し、オブジェクトを再解析することができました。JsonReaderJObject

読み取り、ロールバック、再読み取りを行う方法はありますnestedObjectDeserializerか?

私が呼び出すことができる別のオブジェクト型はありますか?それからプロパティnestedObjectDeserializerを読み取りType、最終的に派生型の通常の YamlDotNet 解析に進みますか?

4

1 に答える 1