Trabajo con YAML en C# (.NET): bibliotecas y ejemplos de uso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 YamlDotNet

O 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: secret


Creemos 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}");

Recommendations