Работа с YAML в C# (.NET): библиотеки и примеры использования

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с YAML в C# (.NET): библиотеки и практические примеры

YAML (YAML Ain't Markup Language) — популярный формат сериализации данных, широко используемый для файлов конфигурации, DevOps (Ansible, Kubernetes, Docker Compose) и обмена данными. В экосистеме .NET нет встроенной поддержки YAML, однако существуют мощные сторонние библиотеки. В этой статье мы рассмотрим две основные: YamlDotNet (самая популярная) и SharpYaml (лёгкая альтернатива), а также покажем, как интегрировать их в проекты C#.

1. Почему выбирают YAML вместо JSON/XML?

  • Человекочитаемый синтаксис с отступами (без скобок и кавычек).
  • Поддержка комментариев (начинаются с #).
  • Встроенная поддержка сложных структур (списки, словари, многострочные строки).
  • Стандарт де-факто для конфигураций в контейнеризации и CI/CD.

2. Основная библиотека: YamlDotNet

YamlDotNet — наиболее зрелая и поддерживаемая библиотека для .NET (включая .NET Core, .NET 5+). Она предоставляет полный цикл: десериализация (YAML → объекты C#) и сериализация (объекты → YAML).

2.1 Установка через NuGet

dotnet add package YamlDotNet

Или через менеджер пакетов Visual Studio: Install-Package YamlDotNet.

2.2 Базовая десериализация

Предположим, у нас есть файл config.yaml:

# Настройки приложения
app:
  name: MyApp
  version: 1.0.0
  debug: false

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

Создадим соответствующие классы C#:

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

Теперь парсим YAML в объекты:

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

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

var deserializer = new DeserializerBuilder()
    .WithNamingConvention(UnderscoredNamingConvention.Instance) // для подчёркиваний
    .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 Сериализация объектов в 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 Работа с динамическими данными

Если структура YAML неизвестна заранее, используйте Dictionary<object, object>:

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

var result = deserializer.Deserialize<Dictionary<object, object>>(yamlContent);
// Рекурсивный обход словаря
PrintYaml(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}");
        if (kvp.Value is Dictionary<object, object> nested)
            PrintYaml(nested, indent + 1);
    }
}

3. Альтернатива: SharpYaml

SharpYaml — более лёгкая библиотека, совместимая с синтаксисом YAML 1.1. Она особенно удобна для быстрой сериализации/десериализации без дополнительных настроек.

3.1 Установка

dotnet                    

Рекомендаций