在 C# (.NET) 中使用 YAML:库与使用示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 C# (.NET) 中使用 YAML:库与实用示例



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

推荐