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 @@
-
-
-
-
+
+
+
+