YAML (YAML Ain't Markup Language) 是一种人类友好的数据序列化格式,在配置文件、数据交换等场景中广泛使用。本文将详细介绍如何在.NET中优雅地处理YAML文件,从基础操作到高级应用,帮助开发者掌握YAML文件处理的各种技巧。
首先,我们需要安装YamlDotNet包,这是.NET中最流行的YAML处理库:
C#// 通过NuGet安装
Install-Package YamlDotNet
// 或者使用.NET CLI
dotnet add package YamlDotNet
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();
}
}
}
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);
}
}
}
}
}
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();
}
}
}
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应用程序中的各种场景。
要点回顾:
希望本文能够帮助您在.NET项目中更好地使用YAML文件。如有任何问题,欢迎在评论区讨论。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!