Trabalhando com YAML em C# (.NET): biblioteca YamlDotNet
YAML (YAML Ain't Markup Language) é um formato conveniente de serialização de dados, frequentemente usado para arquivos de configuração, descrição de pipelines CI/CD, Docker Compose e manifestos Kubernetes. No ecossistema .NET, a principal biblioteca para trabalhar com YAML é YamlDotNet — uma ferramenta poderosa, performática e totalmente compatível com as especificações YAML 1.1 e 1.2.
Neste artigo, abordaremos: como instalar o YamlDotNet, realizar serialização e desserialização básica de objetos C#, configurar tags personalizadas e processar estruturas de dados complexas.
Instalação do YamlDotNet
A biblioteca está disponível via NuGet. Execute o comando no console do gerenciador de pacotes:
dotnet add package YamlDotNetOu através do Package Manager Console:
Install-Package YamlDotNetUso básico: desserialização de YAML para objeto C#
Suponha que temos um arquivo YAML config.yaml com as configurações da aplicação:
app: name: MyApp version: 2.0.1 debug: truedatabase: host: localhost port: 5432 credentials: user: admin password: secretCriaremos as classes C# correspondentes:
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 CredentialsConfig Credentials { get; set; }}
public class CredentialsConfig{ public string User { get; set; } public string Password { get; set; }}
public class RootConfig{ public AppConfig App { get; set; } public DatabaseConfig Database { get; set; }}Agora, desserializamos o YAML para um objeto:
using YamlDotNet.Serialization;using YamlDotNet.Serialization.NamingConventions;
var yamlContent = File.ReadAllText("config.yaml");
var deserializer = new DeserializerBuilder() .WithNamingConvention(UnderscoredNamingConvention.Instance) // para snake_case .Build();
var config = deserializer.Deserialize<RootConfig>(yamlContent);
Console.WriteLine(config.App.Name); // MyAppConsole.WriteLine(config.Database.Port); // 5432Serialização de objetos C# para YAML
A tarefa inversa — transformar um objeto C# em uma string YAML:
var config = new RootConfig{ App = new AppConfig { Name = "MyApp", Version = "2.0.1", Debug = true }, Database = new DatabaseConfig { Host = "localhost", Port = 5432, Credentials = new CredentialsConfig { User = "admin", Password = "secret" } }};
var serializer = new SerializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) // camelCase no YAML .Build();
var yaml = serializer.Serialize(config);Console.WriteLine(yaml);Resultado:
app: name: MyApp version: 2.0.1 debug: truedatabase: host: localhost port: 5432 credentials: user: admin password: secretTrabalhando com coleções e tipos complexos
O YamlDotNet suporta perfeitamente listas, dicionários e estruturas aninhadas. Exemplo com lista:
public class Project{ public string Name { get; set; } public List<string> Tags { get; set; }}
// YAML:// name: MyProject// tags:// - dotnet// - yaml// - csharp
var yaml = @"name: MyProjecttags: - dotnet - yaml - csharp";
var deserializer = new DeserializerBuilder().Build();var project = deserializer.Deserialize<Project>(yaml);
foreach (var tag in project.Tags) Console.WriteLine(tag);Tags e tipos personalizados (TagMapping)
Às vezes, arquivos YAML contêm tags explícitas