Arbeit mit YAML in C# (.NET): Bibliotheken und praktische Beispiele
YAML (YAML Ain't Markup Language) ist ein beliebtes Daten-Serialisierungsformat, das häufig für Konfigurationsdateien, DevOps (Ansible, Kubernetes, Docker Compose) und Datenaustausch verwendet wird. Im .NET-Ökosystem gibt es keine integrierte YAML-Unterstützung, jedoch leistungsstarke Drittanbieter-Bibliotheken. In diesem Artikel betrachten wir zwei Hauptbibliotheken: YamlDotNet (die beliebteste) und SharpYaml (eine leichte Alternative), und zeigen, wie man sie in C#-Projekte integriert.
1. Warum YAML statt JSON/XML wählen?
- Menschenlesbare Syntax mit Einrückungen (ohne Klammern und Anführungszeichen).
- Unterstützung für Kommentare (beginnen mit #).
- Integrierte Unterstützung für komplexe Strukturen (Listen, Wörterbücher, mehrzeilige Zeichenfolgen).
- De-facto-Standard für Konfigurationen in Containerisierung und CI/CD.
2. Hauptbibliothek: YamlDotNet
YamlDotNet ist die ausgereifteste und am besten unterstützte Bibliothek für .NET (einschließlich .NET Core, .NET 5+). Sie bietet den vollständigen Zyklus: Deserialisierung (YAML → C#-Objekte) und Serialisierung (Objekte → YAML).
2.1 Installation über NuGet
dotnet add package YamlDotNetOder über den Paketmanager von Visual Studio: Install-Package YamlDotNet.
2.2 Basis-Deserialisierung
Angenommen, wir haben eine Datei config.yaml:
# Anwendungseinstellungenapp: name: MyApp version: 1.0.0 debug: false
database: host: localhost port: 5432 credentials: user: admin password: secretErstellen wir die entsprechenden C#-Klassen:
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; }}Jetzt parsen wir YAML in Objekte:
using YamlDotNet.Serialization;using YamlDotNet.Serialization.NamingConventions;
var yamlContent = File.ReadAllText("config.yaml");
var deserializer = new DeserializerBuilder() .WithNamingConvention(UnderscoredNamingConvention.Instance) // für Unterstriche .Build();
var config = deserializer.Deserialize<RootConfig>(yamlContent);
Console.WriteLine($"App: {config.App.Name} v{config.App.Version}");Console.WriteLine($"DB host: {config.Database.Host}:{config.Database.Port}");2.3 Serialisierung von Objekten in 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 Arbeit mit dynamischen Daten
Wenn die YAML-Struktur nicht im Voraus bekannt ist, verwenden Sie Dictionary<object, object>:
var deserializer = new DeserializerBuilder() .Build();
var result = deserializer.Deserialize<Dictionary<object, object>>(yamlContent);// Rekursives Durchlaufen des WörterbuchsPrintYaml(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}"); Auch in der Bibliothek
Dependency Injection Container für Go (Golang) — wire, dig, fx
tRPC für TypeScript: Vollständiger Leitfaden mit Beispielen
Arbeiten mit ZIP-Archiven in TypeScript: Bibliothek JSZip und Hilfsprogramme
Lottie Android Kotlin: Komplette Anleitung mit Beispielen
iTextSharp für C# (.NET): Komplettguide mit Beispielen