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