Travailler avec YAML en C# (.NET) : bibliothèques et exemples pratiques
YAML (YAML Ain't Markup Language) est un format de sérialisation de données populaire, largement utilisé pour les fichiers de configuration, DevOps (Ansible, Kubernetes, Docker Compose) et l'échange de données. Dans l'écosystème .NET, il n'y a pas de support intégré pour YAML, mais il existe de puissantes bibliothèques tierces. Dans cet article, nous examinerons deux principales : YamlDotNet (la plus populaire) et SharpYaml (une alternative légère), et nous montrerons comment les intégrer dans des projets C#.
1. Pourquoi choisir YAML plutôt que JSON/XML ?
- Syntaxe lisible par l'homme avec des indentations (sans parenthèses ni guillemets).
- Prise en charge des commentaires (commençant par #).
- Prise en charge intégrée des structures complexes (listes, dictionnaires, chaînes multilignes).
- Standard de facto pour les configurations dans la conteneurisation et le CI/CD.
2. Bibliothèque principale : YamlDotNet
YamlDotNet est la bibliothèque la plus mature et la mieux maintenue pour .NET (y compris .NET Core, .NET 5+). Elle fournit un cycle complet : désérialisation (YAML → objets C#) et sérialisation (objets → YAML).
2.1 Installation via NuGet
dotnet add package YamlDotNetOu via le gestionnaire de packages Visual Studio : Install-Package YamlDotNet.
2.2 Désérialisation de base
Supposons que nous ayons un fichier config.yaml :
# Paramètres de l'applicationapp: name: MyApp version: 1.0.0 debug: false
database: host: localhost port: 5432 credentials: user: admin password: secretCréons les classes C# correspondantes :
public class AppConfig{ public string Name { get; set; } public string Version { get; set; } public bool Debug { get; set; }}
public class DatabaseConfig{ public string Host { get; set; } public int Port { get; set; } public Credentials Credentials { get; set; }}
public class Credentials{ public string User { get; set; } public string Password { get; set; }}
public class RootConfig{ public AppConfig App { get; set; } public DatabaseConfig Database { get; set; }}Analysons maintenant le YAML en objets :
using YamlDotNet.Serialization;using YamlDotNet.Serialization.NamingConventions;
var yamlContent = File.ReadAllText("config.yaml");
var deserializer = new DeserializerBuilder() .WithNamingConvention(UnderscoredNamingConvention.Instance) // pour les underscores .Build();
var config = deserializer.Deserialize<RootConfig>(yamlContent);
Console.WriteLine($"App : {config.App.Name} v{config.App.Version}");Console.WriteLine($"Hôte DB : {config.Database.Host}:{config.Database.Port}");2.3 Sérialisation d'objets en YAML
var serializer = new SerializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) .Build();
var config = new RootConfig{ App = new AppConfig { Name = "TestApp", Version = "2.0.0", Debug = true }, Database = new DatabaseConfig { Host = "192.168.1.1", Port = 3306, Credentials = new Credentials { User = "root", Password = "qwerty" } }};
string yamlOutput = serializer.Serialize(config);Console.WriteLine(yamlOutput);2.4 Travailler avec des données dynamiques
Si la structure YAML est inconnue à l'avance, utilisez Dictionary<object, object> :
var deserializer = new DeserializerBuilder() .Build();
var result = deserializer.Deserialize<Dictionary<object, object>>(yamlContent);// Parcours récursif du dictionnairePrintYaml(result, 0);
void PrintYaml(Dictionary<object, object> dict, int indent){ foreach (var kvp in dict) { Console.WriteLine($"{new string(' ', indent * 2)}{kvp.Key}: {kvp.Value}");