using System.Collections.Generic;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
public 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<,>))
var pairArgs = expectedType.GetGenericArguments();
parser.Expect<MappingStart>();
while (parser.Allow<MappingEnd>() == null)
var keyName = parser.Expect<Scalar>();
pairKey = nestedObjectDeserializer(parser, pairArgs[0]);
pairValue = nestedObjectDeserializer(parser, pairArgs[1]);
throw new YamlException(keyName.Start, keyName.End,
string.Format("Expected one of ['Key', 'Value'], got '{0}' (at {1}).", keyName.Start));
value = Activator.CreateInstance(expectedType, pairKey, pairValue);
public KeyValuePair<string, int> Pair { get; set; }
public static void Main()
var serializer = new SerializerBuilder()
var yaml = serializer.Serialize(new Model
Pair = new KeyValuePair<string, int>("key", 1)
var deserializer = new DeserializerBuilder()
.WithNodeDeserializer(new KeyValuePairNodeDeserializer())
var parsed = deserializer.Deserialize<Model>(yaml);