From 2eb90237db3bea8895d3e61aa5d220a2b3b33c31 Mon Sep 17 00:00:00 2001 From: Christopher Mann Date: Tue, 29 Oct 2024 16:49:48 +0100 Subject: [PATCH] Support YamlConverterAttribute in attribute overrides --- .../TypeConverterAttributeTests.cs | 44 +++++++++++++++++++ .../YamlAttributeOverridesInspector.cs | 3 +- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/YamlDotNet.Test/Serialization/TypeConverterAttributeTests.cs b/YamlDotNet.Test/Serialization/TypeConverterAttributeTests.cs index 88539c8c..34b7ffe7 100644 --- a/YamlDotNet.Test/Serialization/TypeConverterAttributeTests.cs +++ b/YamlDotNet.Test/Serialization/TypeConverterAttributeTests.cs @@ -29,6 +29,45 @@ namespace YamlDotNet.Test.Serialization { public class TypeConverterAttributeTests { + [Fact] + public void TestConverterInAttributeOverride_Deserializes() + { + var deserializer = new DeserializerBuilder() + .WithAttributeOverride( + c => c.Value, + new YamlConverterAttribute(typeof(AttributedTypeConverter))) + .WithTypeConverter(new AttributedTypeConverter()) + .Build(); + var yaml = @"Value: + abc: def"; + var actual = deserializer.Deserialize(yaml); + Assert.Equal("abc", actual.Value.Key); + Assert.Equal("def", actual.Value.Value); + } + + [Fact] + public void TestConverterInAttributeOverride_Serializes() + { + var serializer = new SerializerBuilder() + .WithAttributeOverride( + c => c.Value, + new YamlConverterAttribute(typeof(AttributedTypeConverter))) + .WithTypeConverter(new AttributedTypeConverter()) + .Build(); + var o = new OuterClassWithoutAttribute + { + Value = new ValueClass + { + Key = "abc", + Value = "def" + } + }; + var actual = serializer.Serialize(o).NormalizeNewLines().TrimNewLines(); + var expected = @"Value: + abc: def".NormalizeNewLines().TrimNewLines(); + Assert.Equal(expected, actual); + } + [Fact] public void TestConverterOnAttribute_Deserializes() { @@ -94,6 +133,11 @@ public class OuterClass public ValueClass Value { get; set; } } + public class OuterClassWithoutAttribute + { + public ValueClass Value { get; set; } + } + public class ValueClass { public string Key { get; set; } diff --git a/YamlDotNet/Serialization/YamlAttributeOverridesInspector.cs b/YamlDotNet/Serialization/YamlAttributeOverridesInspector.cs index 99469ec9..6b2b6bbd 100644 --- a/YamlDotNet/Serialization/YamlAttributeOverridesInspector.cs +++ b/YamlDotNet/Serialization/YamlAttributeOverridesInspector.cs @@ -81,7 +81,8 @@ public Type? TypeOverride set { baseDescriptor.TypeOverride = value; } } - public Type? ConverterType => baseDescriptor.ConverterType; + public Type? ConverterType => + GetCustomAttribute()?.ConverterType ?? baseDescriptor.ConverterType; public int Order {