最近在项目中,业务上需要与Python进行交互,而Python程序用的配置文件主要是YAML,程序以命令行形式运行,前端页面由C#通过WPF开发完成。现在需要通过C#生成YAML配置文件,并经过Python读取和修改后,再次由C#进行读取。在C#开发程序中,主要用的配置文件主要是XML,JSON,INI等,很少用到YAML,今天以一个简单的小例子,简述如何通过C#程序,进行YAML文件的读取和写入,仅供学习和参考使用,如有不足之前,还请指正。

YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。
YAML吸收了XML,JSON,INI等格式文件的优点,主要有以下几种特点:
YAML以数据为中心,支持的数据类型主要有以下几种:
列表获数组,与Python的list数组结构类似,数组元素使用“-”开头,也可以根据缩进进行数组嵌套。如下所示:
- #行内写法:
- k: [v1,v2,v3]
- #或者
- k:
- - v1
- - v2
- - v3
对象【map,hash,set,object】表示一组键值对,使用冒号结构表示。类似Python中的字典数据结构。
- platformName: Android
- platformVersion: 6.0.1
注意:冒号后面一定要有空格!
在本示例中,主要通过YamlDotNet库进行Yaml文件的读取的和写入,即对象的序列化和反序列化。在VS中,点击项目右键,打开Nuget包管理器,然后搜索YamlDotNet库[当前版本为15.1.6]进行安装,如下所示:

YamlDotNet对应的GitHup地址为:GitHub - aaubry/YamlDotNet: YamlDotNet is a .NET library for YAML

Yaml帮助类主要包括读取和写入Yaml文件两个功能。
从Yaml文件中读,并反序列化,主要通过DeserializerBuilder类进行构建反序列号接口,然后再反序列化,如下所示:
- public static T ReadYaml<T>(string file)
- {
- var target = DeserializeFromFile
(file); - return target;
- }
-
- public static T Deserialize<T>(string yaml)
- {
- IDeserializer _deserializer = new DeserializerBuilder().WithNamingConvention(UnderscoredNamingConvention.Instance).Build();
- return _deserializer.Deserialize
(yaml); - }
-
- public static T DeserializeFromFile<T>(string filePath)
- {
- var yaml = File.ReadAllText(filePath, Encoding.UTF8);
- return Deserialize
(yaml); - }
向Yaml文件写入或者创建Yaml文件,主要通过SerializerBuilder构造序列化接口,然后再执行序列号操作,如下所示:
- public static bool WriteToYaml<T>(string file, T obj)
- {
- return SerializeToFile(file, obj);
- }
-
- public static string Serialize<T>(T target)
- {
- var _serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
- return _serializer.Serialize(target);
- }
-
- public static bool SerializeToFile<T>(string filePath, T target)
- {
- var content = Serialize(target);
- File.WriteAllText(filePath, content, Encoding.UTF8);
- return true;
- }
Test类型主要用于验证,包含数字,字符串,数组,字典等数据类型,如下所示:
- public class Test
- {
- public string[] A1 { get; set; }
-
- public string A2 { get; set; }
-
- public int A3 { get; set; }
-
- public Dictionary<string, string> A4 { get; set; }
-
- }
构造数据并调用YAML帮助类,生成Yaml文件,如下所示:
- var test = new Test();
- test.A1 = new string[] { "ABC", "BCD", "123" };
- test.A2 = "这是测试";
- test.A3 = 5;
- test.A4 = new Dictionary<string, string>();
- test.A4.Add("KEY1", "VAL1");
- test.A4.Add("KEY2", "VAL2");
- test.A4.Add("KEY3", "VAL3");
- YamlHelper.WriteToYaml
("test.yaml", test);
生成的Yaml文件,如下所示:
- a1:
- - ABC
- - BCD
- - 123
- a2: 这是测试
- a3: 5
- a4:
- KEY1: VAL1
- KEY2: VAL2
- KEY3: VAL3
读取Yaml文件,并反序列化为对应对象,如下所示:
- var test = YamlHelper.ReadYaml
("test.yaml"); - Console.WriteLine(String.Join(',', test.A1));
- Console.WriteLine(test.A2);
- Console.WriteLine(test.A3);
- Console.WriteLine(test.A4.Count);
以上就是【.NET数据交互之生成和读取YAML文件】的全部内容,希望可以一起学习,共同进步。