Работа с 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 Также в библиотеке
Работа с XML в Go (Golang): пакет encoding/xml и альтернативы
Отправка SMS на C# (.NET): API библиотеки и примеры кода
Стандартная библиотека Kotlin: полный обзор и примеры
Миграции баз данных в TypeScript: полное руководство по инструментам и подходам
Мониторинг PHP-приложений: инструменты и практики для разработчика