using System;
using System.Collections.Generic;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
internal class KeyValuePairNodeDeserializer : INodeDeserializer
{
public bool Deserialize(IParser parser, Type expectedType, Func<IParser, Type, object> nestedObjectDeserializer, out object value)
{
if (expectedType.IsGenericType && expectedType.GetGenericTypeDefinition() == typeof(KeyValuePair<,>))
{
parser.Consume<MappingStart>();
var pairArgs = expectedType.GetGenericArguments();
object key = null;
object val = null;
if (parser.Accept<Scalar>(out _))
key = nestedObjectDeserializer(parser, pairArgs[0]);
if (parser.Accept<Scalar>(out _))
val = nestedObjectDeserializer(parser, pairArgs[1]);
value = Activator.CreateInstance(expectedType, key, val);
parser.Consume<MappingEnd>();
return true;
}
value = null;
return false;
}
}
现在您可以注册您的自定义INodeDeserializer如下:
var deserializer = new DeserializerBuilder()
.WithNodeDeserializer(new KeyValuePairNodeDeserializer()) // Register here.
.WithNamingConvention(UnderscoredNamingConvention.Instance)
.Build();
1条答案
按热度按时间xoefb8l81#
根据YamlDotNet的所有者aubry的说法,issue here声明
KeyValuePair<,>
不受支持,也不会受到支持。然而,他在同一问题下的回应中进一步指出,通过添加自定义INodeDeserializer
可以轻松实现。但是,由于他所包含的示例不适用,我将在这里提供一个更准确的实现。现在您可以注册您的自定义
INodeDeserializer
如下: