yamldotnet

Cómo trabajar con YAML en .NET con YamlDotNet

YamlDotNet es una biblioteca de C# que permite trabajar con archivos YAML en aplicaciones en .NET.

YAML (Yet Another Markup Language) es un formato de archivo de texto plano utilizado para representar datos estructurados, como configuraciones o definiciones de recursos.

Es una alternativa a otros formatos como JSON o XML, y es frecuentemente usado en ficheros de configuración. Por ejemplo, es habitual encontrarlo en ‘frontmatter’ en documentos de markdown.

YamlDotNet nos permite deserializar formato YAML de forma muy sencilla. Proporciona compatibilidad con todas las características de YAML, incluidas las anotaciones, las referencias a recursos, etc.

Además ha sido diseñado para ofrecer una alta optimización. Por lo cual, podéis esperar un alto rendimiento, incluso al trabajar con ficheros grandes.

Es compatible con .NET Framework, .NET Standard 2.0 y 2.1, y .NET 6.0 o posterior.

Cómo usar YamlDotNet

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package YamlDotNet

Aquí tenéis algunos de cómo utilizar YamlDotNet para trabajar con archivos YAML en C#, extraídos de la documentación de la librería

Serializar un objeto a string

Para serializar un objeto únicamente tenemos que instanciar un Serializer y llamar al método ‘Serialize’. Así de sencillo.

using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

// Objeto de ejemplo
var person = new Person
{
    Name = "Abe Lincoln",
    Age = 25,
    HeightInInches = 6f + 4f / 12f,
    Addresses = new Dictionary<string, Address>{
        { "home", new  Address() {
                Street = "2720  Sundown Lane",
                City = "Kentucketsville",
                State = "Calousiyorkida",
                Zip = "99978",
            }},
        { "work", new  Address() {
                Street = "1600 Pennsylvania Avenue NW",
                City = "Washington",
                State = "District of Columbia",
                Zip = "20500",
            }},
    }
};

// Serializar
var serializer = new SerializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .Build();
var yaml = serializer.Serialize(person);
System.Console.WriteLine(yaml);

Que daría como resultado el siguiente YAML contenido en el string.

name: Abe Lincoln
age: 25
heightInInches: 6.3333334922790527
addresses:
  home:
    street: 2720  Sundown Lane
   city: Kentucketsville
    state: Calousiyorkida
    zip: 99978
  work:
    street: 1600 Pennsylvania Avenue NW
    city: Washington
    state: District of Columbia
    zip: 20500

Deserializar un string a objeto

Deserializar un básicamente similar. Únicamente tenemos que crear un Deserilizer, y llamar al método ‘Deserialize’

using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
...

// nuestro string con el yaml
var yml = @"
name: George Washington
age: 89
height_in_inches: 5.75
addresses:
  home:
    street: 400 Mockingbird Lane
    city: Louaryland
    state: Hawidaho
    zip: 99970
";

// deserializar
var deserializer = new DeserializerBuilder()
    .WithNamingConvention(UnderscoredNamingConvention.Instance)
    .Build();

var person = deserializer.Deserialize<Person>(yml);

Que nos daría como resultado en ‘person’ nuestro objeto con todas las propiedades correctamente rellenadas, incluido los miembros y colecciones hijas.

YamlDotNet es Open Source, y todo el código y documentación está disponible en el repositorio del proyecto en https://github.com/aaubry/YamlDotNet