From e65f6fc2e94195a7526e8acd7fa471952f18dcdc Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sat, 15 Aug 2026 15:44:16 +0200 Subject: [PATCH] YamlDotNet: retarget net10.0, bump to 18.1.0, add naming-convention example Update INodeDeserializer.Deserialize to the 18.x signature (adds ObjectDeserializer rootDeserializer). Add ServiceConfig model, NamingConventions use case with hyphenated round-trip, and tests. --- .../YamlDotNet/App/App.csproj | 4 +-- .../YamlDotNet/App/Models/ServiceConfig.cs | 7 +++++ .../YamlDotNet/App/Program.cs | 10 +++++++ .../App/UseCases/DeserializerValidation.cs | 6 ++-- .../App/UseCases/NamingConventions.cs | 24 +++++++++++++++ .../Tests/NamingConventionsTests.cs | 29 +++++++++++++++++++ .../YamlDotNet/Tests/Tests.csproj | 10 +++---- 7 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 dotnet-client-libraries/YamlDotNet/App/Models/ServiceConfig.cs create mode 100644 dotnet-client-libraries/YamlDotNet/App/UseCases/NamingConventions.cs create mode 100644 dotnet-client-libraries/YamlDotNet/Tests/NamingConventionsTests.cs diff --git a/dotnet-client-libraries/YamlDotNet/App/App.csproj b/dotnet-client-libraries/YamlDotNet/App/App.csproj index c164e1cea2..789c79eebf 100644 --- a/dotnet-client-libraries/YamlDotNet/App/App.csproj +++ b/dotnet-client-libraries/YamlDotNet/App/App.csproj @@ -2,13 +2,13 @@ Exe - net8.0 + net10.0 enable enable - + diff --git a/dotnet-client-libraries/YamlDotNet/App/Models/ServiceConfig.cs b/dotnet-client-libraries/YamlDotNet/App/Models/ServiceConfig.cs new file mode 100644 index 0000000000..544ac3d9ab --- /dev/null +++ b/dotnet-client-libraries/YamlDotNet/App/Models/ServiceConfig.cs @@ -0,0 +1,7 @@ +namespace App.Models; + +public class ServiceConfig +{ + public required string ServiceName { get; set; } + public int MaxRetries { get; set; } +} diff --git a/dotnet-client-libraries/YamlDotNet/App/Program.cs b/dotnet-client-libraries/YamlDotNet/App/Program.cs index eb9a74d2b2..1f1e85c5aa 100644 --- a/dotnet-client-libraries/YamlDotNet/App/Program.cs +++ b/dotnet-client-libraries/YamlDotNet/App/Program.cs @@ -2,6 +2,7 @@ using App.UseCases; using YamlDotNet.Core; using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; namespace App; @@ -80,6 +81,15 @@ var deserializer Console.WriteLine($"Unable to deserialize person: {e.Message}"); } + // Map YAML Names to C# Property Names + + var config = new ServiceConfig { ServiceName = "orders", MaxRetries = 3 }; + var hyphenatedYaml = NamingConventions.Serialize(config, HyphenatedNamingConvention.Instance); + Console.WriteLine(hyphenatedYaml); + + var deserializeConfig = NamingConventions.Deserialize(hyphenatedYaml, HyphenatedNamingConvention.Instance); + Console.WriteLine($"ServiceName: {deserializeConfig.ServiceName}, MaxRetries: {deserializeConfig.MaxRetries}"); + // JSON Support in YamlDotNet var yamlPerson = """ diff --git a/dotnet-client-libraries/YamlDotNet/App/UseCases/DeserializerValidation.cs b/dotnet-client-libraries/YamlDotNet/App/UseCases/DeserializerValidation.cs index 4a1a00aa57..99a64e35ab 100644 --- a/dotnet-client-libraries/YamlDotNet/App/UseCases/DeserializerValidation.cs +++ b/dotnet-client-libraries/YamlDotNet/App/UseCases/DeserializerValidation.cs @@ -8,9 +8,9 @@ namespace App.UseCases; public class DeserializerValidation(INodeDeserializer nodeDeserializer) : INodeDeserializer { public bool Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, - out object? value) + out object? value, ObjectDeserializer rootDeserializer) { - if (!nodeDeserializer.Deserialize(reader, expectedType, nestedObjectDeserializer, out value)) + if (!nodeDeserializer.Deserialize(reader, expectedType, nestedObjectDeserializer, out value, rootDeserializer)) return false; var context = new ValidationContext(value); @@ -21,4 +21,4 @@ public bool Deserialize(IParser reader, Type expectedType, Func r.ErrorMessage)); throw new YamlException(message); } -} \ No newline at end of file +} diff --git a/dotnet-client-libraries/YamlDotNet/App/UseCases/NamingConventions.cs b/dotnet-client-libraries/YamlDotNet/App/UseCases/NamingConventions.cs new file mode 100644 index 0000000000..925f6ee078 --- /dev/null +++ b/dotnet-client-libraries/YamlDotNet/App/UseCases/NamingConventions.cs @@ -0,0 +1,24 @@ +using YamlDotNet.Serialization; + +namespace App.UseCases; + +public static class NamingConventions +{ + public static string Serialize(T obj, INamingConvention namingConvention) + { + var serializer = new SerializerBuilder() + .WithNamingConvention(namingConvention) + .Build(); + + return serializer.Serialize(obj); + } + + public static T Deserialize(string yaml, INamingConvention namingConvention) + { + var deserializer = new DeserializerBuilder() + .WithNamingConvention(namingConvention) + .Build(); + + return deserializer.Deserialize(yaml); + } +} diff --git a/dotnet-client-libraries/YamlDotNet/Tests/NamingConventionsTests.cs b/dotnet-client-libraries/YamlDotNet/Tests/NamingConventionsTests.cs new file mode 100644 index 0000000000..211e8c5a87 --- /dev/null +++ b/dotnet-client-libraries/YamlDotNet/Tests/NamingConventionsTests.cs @@ -0,0 +1,29 @@ +using App.Models; +using App.UseCases; +using static System.Environment; +using YamlDotNet.Serialization.NamingConventions; + +namespace Tests; + +public class NamingConventionsTests +{ + [Fact] + public void GivenConfig_WhenSerializedWithHyphenatedConvention_ThenKeysAreHyphenated() + { + var config = new ServiceConfig { ServiceName = "orders", MaxRetries = 3 }; + var expectedYaml = $"service-name: orders{NewLine}max-retries: 3{NewLine}"; + var actualYaml = NamingConventions.Serialize(config, HyphenatedNamingConvention.Instance); + + Assert.Equal(expectedYaml, actualYaml); + } + + [Fact] + public void GivenHyphenatedYaml_WhenDeserializedWithHyphenatedConvention_ThenConfigIsReturned() + { + var yaml = $"service-name: orders{NewLine}max-retries: 3"; + var actualConfig = NamingConventions.Deserialize(yaml, HyphenatedNamingConvention.Instance); + + Assert.Equal("orders", actualConfig.ServiceName); + Assert.Equal(3, actualConfig.MaxRetries); + } +} diff --git a/dotnet-client-libraries/YamlDotNet/Tests/Tests.csproj b/dotnet-client-libraries/YamlDotNet/Tests/Tests.csproj index c6c83f4f4e..b4f9d2e8bd 100644 --- a/dotnet-client-libraries/YamlDotNet/Tests/Tests.csproj +++ b/dotnet-client-libraries/YamlDotNet/Tests/Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable @@ -10,10 +10,10 @@ - - - - + + + +