Trabajo con YAML en C# (.NET): bibliotecas y ejemplos prácticos
YAML (YAML Ain't Markup Language) es un formato popular de serialización de datos, ampliamente utilizado para archivos de configuración, DevOps (Ansible, Kubernetes, Docker Compose) e intercambio de datos. En el ecosistema .NET no hay soporte integrado para YAML, sin embargo, existen potentes bibliotecas de terceros. En este artículo veremos dos principales: YamlDotNet (la más popular) y SharpYaml (una alternativa ligera), y mostraremos cómo integrarlas en proyectos C#.
1. ¿Por qué elegir YAML en lugar de JSON/XML?
- Sintaxis legible por humanos con sangrías (sin corchetes ni comillas).
- Soporte de comentarios (comienzan con #).
- Soporte nativo de estructuras complejas (listas, diccionarios, cadenas multilínea).
- Estándar de facto para configuraciones en contenedores y CI/CD.
2. Biblioteca principal: YamlDotNet
YamlDotNet es la biblioteca más madura y mantenida para .NET (incluyendo .NET Core, .NET 5+). Proporciona el ciclo completo: deserialización (YAML → objetos C#) y serialización (objetos → YAML).
2.1 Instalación a través de NuGet
dotnet add package YamlDotNetO a través del administrador de paquetes de Visual Studio: Install-Package YamlDotNet.
2.2 Deserialización básica
Supongamos que tenemos un archivo config.yaml:
# Configuración de la aplicaciónapp: name: MyApp version: 1.0.0 debug: false
database: host: localhost port: 5432 credentials: user: admin password: secretCreemos las clases C# correspondientes:
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; }}Ahora analizamos YAML en objetos:
using YamlDotNet.Serialization;using YamlDotNet.Serialization.NamingConventions;
var yamlContent = File.ReadAllText("config.yaml");
var deserializer = new DeserializerBuilder() .WithNamingConvention(UnderscoredNamingConvention.Instance) // para guiones bajos .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 Serialización de objetos a 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 Trabajo con datos dinámicos
Si la estructura YAML no se conoce de antemano, use Dictionary<object, object>:
var deserializer = new DeserializerBuilder() .Build();
var result = deserializer.Deserialize<Dictionary<object, object>>(yamlContent);// Recorrido recursivo del diccionarioPrintYaml(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}"); También en la biblioteca
Pruebas en Swift (iOS/macOS): frameworks y herramientas
Métricas de Prometheus en C# (.NET) — biblioteca prometheus-net
gRPC para Rust: bibliotecas y ejemplos de uso
Limitación de Tasa en TypeScript: bibliotecas, herramientas y ejemplos de implementación