Trabalhando com YAML em C# (.NET): bibliotecas e exemplos de uso

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com YAML em C# (.NET): bibliotecas e exemplos práticos



YAML (YAML Ain't Markup Language) é um formato popular de serialização de dados, amplamente utilizado para arquivos de configuração, DevOps (Ansible, Kubernetes, Docker Compose) e troca de dados. No ecossistema .NET não há suporte nativo para YAML, mas existem bibliotecas de terceiros poderosas. Neste artigo, abordaremos duas principais: YamlDotNet (a mais popular) e SharpYaml (uma alternativa leve), além de mostrar como integrá-las em projetos C#.



1. Por que escolher YAML em vez de JSON/XML?

  • Sintaxe legível por humanos com indentação (sem colchetes ou aspas).
  • Suporte a comentários (começam com #).
  • Suporte nativo a estruturas complexas (listas, dicionários, strings multilinha).
  • Padrão de facto para configurações em conteinerização e CI/CD.


2. Biblioteca principal: YamlDotNet

YamlDotNet é a biblioteca mais madura e suportada para .NET (incluindo .NET Core, .NET 5+). Ela oferece o ciclo completo: desserialização (YAML → objetos C#) e serialização (objetos → YAML).



2.1 Instalação via NuGet

dotnet add package YamlDotNet

Ou pelo gerenciador de pacotes do Visual Studio: Install-Package YamlDotNet.



2.2 Desserialização básica

Suponha que temos um arquivo config.yaml:

# Configurações da aplicaçãoapp:  name: MyApp  version: 1.0.0  debug: false

database: host: localhost port: 5432 credentials: user: admin password: secret


Criaremos 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 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; }}


Agora analisamos o YAML em objetos:

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

var yamlContent = File.ReadAllText("config.yaml");

var deserializer = new DeserializerBuilder() .WithNamingConvention(UnderscoredNamingConvention.Instance) // para sublinhados .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 Serialização de objetos em 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 Trabalhando com dados dinâmicos

Se a estrutura do YAML for desconhecida antecipadamente, use Dictionary<object, object>:

var deserializer = new DeserializerBuilder()    .Build();

var result = deserializer.Deserialize<Dictionary<object, object>>(yamlContent);// Percorrimento recursivo do dicionárioPrintYaml(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