编辑
2025-09-17
C#
00

目录

前言
环境准备
基础操作
创建简单的YAML文件
读取YAML文件
进阶应用
复杂对象序列化
YAML文件监控
总结

前言

YAML (YAML Ain't Markup Language) 是一种人类友好的数据序列化格式,在配置文件、数据交换等场景中广泛使用。本文将详细介绍如何在.NET中优雅地处理YAML文件,从基础操作到高级应用,帮助开发者掌握YAML文件处理的各种技巧。

环境准备

首先,我们需要安装YamlDotNet包,这是.NET中最流行的YAML处理库:

C#
// 通过NuGet安装 Install-Package YamlDotNet // 或者使用.NET CLI dotnet add package YamlDotNet

image.png

基础操作

创建简单的YAML文件

C#
using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization; namespace AppYAML { public class Configuration { public string ApplicationName { get; set; } public int Port { get; set; } public List<string> Endpoints { get; set; } } internal class Program { static void Main(string[] args) { // 创建YAML var config = new Configuration { ApplicationName = "MyApp", Port = 8080, Endpoints = new List<string> { "api/v1", "api/v2" } }; var serializer = new SerializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); string yaml = serializer.Serialize(config); File.WriteAllText("./config.yaml", yaml); Console.WriteLine(yaml); Console.ReadKey(); } } }

image.png

读取YAML文件

C#
using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization; namespace AppYAML { public class Configuration { public string ApplicationName { get; set; } public int Port { get; set; } public List<string> Endpoints { get; set; } } internal class Program { static void Main(string[] args) { var config = YamlReader.ReadYaml<Configuration>("config.yaml"); Console.WriteLine($"Application Name: {config.ApplicationName}"); Console.WriteLine($"Port: {config.Port}"); Console.WriteLine($"Endpoints: {string.Join(", ", config.Endpoints)}"); Console.ReadKey(); } public static class YamlReader { public static T ReadYaml<T>(string filePath) { var deserializer = new DeserializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); using (var reader = new StreamReader(filePath)) { return deserializer.Deserialize<T>(reader); } } } } }

image.png

进阶应用

复杂对象序列化

C#
using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization; namespace AppYAML { public class ServerConfig { public class DatabaseSettings { public string ConnectionString { get; set; } public int Timeout { get; set; } public Dictionary<string, string> Parameters { get; set; } } public string Environment { get; set; } public DatabaseSettings Database { get; set; } public List<string> AllowedHosts { get; set; } } internal class Program { static void Main(string[] args) { // 创建复杂配置 var serverConfig = new ServerConfig { Environment = "Production", Database = new ServerConfig.DatabaseSettings { ConnectionString = "Server=localhost;Database=mydb", Timeout = 30, Parameters = new Dictionary<string, string> { { "MaxPoolSize", "100" }, { "Encrypt", "true" } } }, AllowedHosts = new List<string> { "*.example.com", "api.internal" } }; var serializer = new SerializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); string yaml = serializer.Serialize(serverConfig); Console.WriteLine(yaml); Console.ReadKey(); } } }

image.png

YAML文件监控

C#
using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization; using System.Xml; using System; using System.IO; using System.Collections.Generic; namespace AppYAML { public class Configuration { public string ApplicationName { get; set; } public int Port { get; set; } public List<string> Endpoints { get; set; } } public static class YamlReader { public static T ReadYaml<T>(string filePath) { var deserializer = new DeserializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build(); using (var reader = new StreamReader(filePath)) { return deserializer.Deserialize<T>(reader); } } } public class YamlFileWatcher { private readonly string _filePath; private readonly FileSystemWatcher _watcher; public YamlFileWatcher(string filePath) { _filePath = filePath; _watcher = new FileSystemWatcher { Path = Path.GetDirectoryName(filePath), Filter = Path.GetFileName(filePath), EnableRaisingEvents = true }; } public void Watch<T>(Action<T> onChanged) { _watcher.Changed += (s, e) => { try { var config = YamlReader.ReadYaml<T>(_filePath); onChanged(config); } catch (Exception ex) { Console.WriteLine($"Error reading YAML file: {ex.Message}"); } }; } } internal class Program { static void Main(string[] args) { // 使用示例 var watcher = new YamlFileWatcher("./config.yaml"); watcher.Watch<Configuration>(config => { Console.WriteLine($"Configuration updated: {config.ApplicationName}"); }); Console.ReadKey(); } } }

总结

本文详细介绍了在.NET中处理YAML文件的各种方法和最佳实践,从基础的读写操作到高级的自定义转换器和性能优化。通过这些示例,开发者可以更好地理解和使用YAML在.NET应用程序中的各种场景。

要点回顾:

  • 使用YamlDotNet库进行YAML处理
  • 实现基础的序列化和反序列化
  • 处理复杂对象和自定义转换
  • 实现文件监控和动态更新
  • 注意错误处理和验证
  • 考虑性能优化

希望本文能够帮助您在.NET项目中更好地使用YAML文件。如有任何问题,欢迎在评论区讨论。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!