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
新しい を作成し、オブジェクトを再解析することができました。JsonReader
JObject
読み取り、ロールバック、再読み取りを行う方法はありますnestedObjectDeserializer
か?
私が呼び出すことができる別のオブジェクト型はありますか?それからプロパティnestedObjectDeserializer
を読み取りType
、最終的に派生型の通常の YamlDotNet 解析に進みますか?