Travailler avec YAML en C# (.NET) : la bibliothèque YamlDotNet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec YAML en C# (.NET) : la bibliothèque YamlDotNet

\n\n

YAML (YAML Ain't Markup Language) est un format pratique de sérialisation de données, souvent utilisé pour les fichiers de configuration, la description de pipelines CI/CD, les manifestes Docker Compose et Kubernetes. Dans l'écosystème .NET, la bibliothèque principale pour travailler avec YAML est YamlDotNet — un outil puissant, performant et entièrement compatible avec les spécifications YAML 1.1 et 1.2.

\n\n

Dans cet article, nous allons voir : comment installer YamlDotNet, effectuer la sérialisation et la désérialisation de base d'objets C#, configurer des balises personnalisées et traiter des structures de données complexes.

\n\n

Installation de YamlDotNet

\n\n

La bibliothèque est disponible via NuGet. Exécutez la commande dans la console du gestionnaire de packages :

\n\n
dotnet add package YamlDotNet
\n\n

Ou via la console du gestionnaire de packages :

\n\n
Install-Package YamlDotNet
\n\n

Utilisation de base : désérialisation de YAML en objet C#

\n\n

Supposons que nous ayons un fichier YAML config.yaml avec les paramètres de l'application :

\n\n
app:\n  name: MyApp\n  version: 2.0.1\n  debug: true\ndatabase:\n  host: localhost\n  port: 5432\n  credentials:\n    user: admin\n    password: secret
\n\n

Créons les classes C# correspondantes :

\n\n
public class AppConfig\n{\n    public string Name { get; set; }\n    public string Version { get; set; }\n    public bool Debug { get; set; }\n}\n\npublic class DatabaseConfig\n{\n    public string Host { get; set; }\n    public int Port { get; set; }\n    public CredentialsConfig Credentials { get; set; }\n}\n\npublic class CredentialsConfig\n{\n    public string User { get; set; }\n    public string Password { get; set; }\n}\n\npublic class RootConfig\n{\n    public AppConfig App { get; set; }\n    public DatabaseConfig Database { get; set; }\n}
\n\n

Maintenant, désérialisons le YAML en objet :

\n\n
using YamlDotNet.Serialization;\nusing YamlDotNet.Serialization.NamingConventions;\n\nvar yamlContent = File.ReadAllText("config.yaml");\n\nvar deserializer = new DeserializerBuilder()\n    .WithNamingConvention(UnderscoredNamingConvention.Instance) // pour snake_case\n    .Build();\n\nvar config = deserializer.Deserialize<RootConfig>(yamlContent);\n\nConsole.WriteLine(config.App.Name);        // MyApp\nConsole.WriteLine(config.Database.Port);   // 5432
\n\n

Sérialisation d'objets C# en YAML

\n\n

La tâche inverse — convertir un objet C# en chaîne YAML :

\n\n
var config = new RootConfig\n{\n    App = new AppConfig { Name = "MyApp", Version = "2.0.1", Debug = true },\n    Database = new DatabaseConfig\n    {\n        Host = "localhost",\n        Port = 5432,\n        Credentials = new CredentialsConfig { User = "admin", Password = "secret" }\n    }\n};\n\nvar serializer = new SerializerBuilder()\n    .WithNamingConvention(CamelCaseNamingConvention.Instance) // camelCase en YAML\n    .Build();\n\nvar yaml = serializer.Serialize(config);\nConsole.WriteLine(yaml);
\n\n

Résultat :

\n\n
app:\n  name: MyApp\n  version: 2.0.1\n  debug: true\ndatabase:\n  host: localhost\n  port: 5432\n  credentials:\n    user: admin\n    password: secret
\n\n

Travailler avec les collections et les types complexes

\n\n

YamlDotNet prend parfaitement en charge les listes, les dictionnaires et les structures imbriquées. Exemple avec une liste :

\n\n
public class Project\n{\n    public string Name { get; set; }\n    public List<string> Tags { get; set; }\n}\n\n// YAML :\n// name: MyProject\n// tags :\n//   - dotnet\n//   - yaml\n//   - csharp\n\nvar yaml = @"\nname: MyProject\ntags :\n  - dotnet\n  - yaml\n  - csharp\n";\n\nvar deserializer = new DeserializerBuilder().Build();\nvar project = deserializer.Deserialize<Project>(yaml);\n\nforeach (var tag in project.Tags)\n    Console.WriteLine(tag);
\n\n

Balises et types personnalisés (TagMapping)

\n\n

Parfois, les fichiers YAML contiennent des balises explicites

Recommendations