.NET数据交互之生成和读取YAML文件

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

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

 
什么要YAML?

 
YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。YAML以数据为中央,利用空白,缩进,分行组织数据,从而使得表示更加简便易读。
 
YAML的根本特点

 
YAML吸收了XML,JSON,INI等格式文件的优点,主要有以下几种特点:

  • 大小写敏感
  • 利用缩进表示层级关系
  • 缩进时不答应利用Tab键,只答应利用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释
  • 字符串无需加引号,假如要加,单引号会被转义,双引号不会不转义
  • key: value   key和value之间有空格
 
YAML支持的数据类型

 
YAML以数据为中央,支持的数据类型主要有以下几种:

  • 纯量(scalars):单个的、不可再分的值,数据最小的单位,不可以再分割。类似于Python中单个变量
  • 数组:一组按序次排列的值,又称为序列(sequence) / 列表(list),与Python的list数组布局类似,数组元素利用“-”开头,也可以根据缩进举行数组嵌套。
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary),对象的一组键值对,利用冒号布局表示。类似Python中的字典数据布局。
 
YAML数据示例

 
1. 列表示例

 
列表获数组,与Python的list数组布局类似,数组元素利用“-”开头,也可以根据缩进举行数组嵌套。如下所示:
  1. #行内写法:
  2. k: [v1,v2,v3]
  3. #或者
  4. k:
  5. - v1
  6. - v2
  7. - v3
复制代码
 
2. 对象示例

 
对象【map,hash,set,object】表示一组键值对,利用冒号布局表示。类似Python中的字典数据布局。
  1. platformName: Android
  2. platformVersion: 6.0.1
复制代码
 注意:冒号背面一定要有空格!
 
YamlDotNet安装

 
在本示例中,主要通过YamlDotNet库举行Yaml文件的读取的和写入,即对象的序列化和反序列化。在VS中,点击项目右键,打开Nuget包管理器,然后搜索YamlDotNet库[当前版本为15.1.6]举行安装,如下所示:

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

 
创建Yaml帮助类

 
Yaml帮助类主要包括读取和写入Yaml文件两个功能。
 
1. 读取

 
从Yaml文件中读,并反序列化,主要通过DeserializerBuilder类举行构建反序列号接口,然后再反序列化,如下所示:
  1. public static T ReadYaml<T>(string file)
  2. {
  3.         var target = DeserializeFromFile<T>(file);
  4.         return target;
  5. }
  6. public static T Deserialize<T>(string yaml)
  7. {
  8.         IDeserializer _deserializer = new DeserializerBuilder().WithNamingConvention(UnderscoredNamingConvention.Instance).Build();
  9.         return _deserializer.Deserialize<T>(yaml);
  10. }
  11. public static T DeserializeFromFile<T>(string filePath)
  12. {
  13.         var yaml = File.ReadAllText(filePath, Encoding.UTF8);
  14.         return Deserialize<T>(yaml);
  15. }
复制代码
 
2. 写入

 
向Yaml文件写入或者创建Yaml文件,主要通过SerializerBuilder构造序列化接口,然后再执行序列号利用,如下所示:
  1. public static bool WriteToYaml<T>(string file, T obj)
  2. {
  3.         return SerializeToFile(file, obj);
  4. }
  5. public static string Serialize<T>(T target)
  6. {
  7.         var _serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
  8.         return _serializer.Serialize(target);
  9. }
  10. public static bool SerializeToFile<T>(string filePath, T target)
  11. {
  12.         var content = Serialize(target);
  13.         File.WriteAllText(filePath, content, Encoding.UTF8);
  14.         return true;
  15. }
复制代码
 
测试验证

 
1. 起首创建Test类

 
Test类型主要用于验证,包含数字,字符串,数组,字典等数据类型,如下所示:
 
  1. public class Test
  2. {
  3.         public string[] A1 { get; set; }
  4.         public string A2 { get; set; }
  5.         public int A3 { get; set; }
  6.         public Dictionary<string, string> A4 { get; set; }
  7. }
复制代码
 
2. 构造数据并调用YAML帮助类

 
 构造数据并调用YAML帮助类,生成Yaml文件,如下所示:
  1. var test = new Test();
  2. test.A1 = new string[] { "ABC", "BCD", "123" };
  3. test.A2 = "这是测试";
  4. test.A3 = 5;
  5. test.A4 = new Dictionary<string, string>();
  6. test.A4.Add("KEY1", "VAL1");
  7. test.A4.Add("KEY2", "VAL2");
  8. test.A4.Add("KEY3", "VAL3");
  9. YamlHelper.WriteToYaml<Test>("test.yaml", test);
复制代码
生成的Yaml文件,如下所示:
  1. a1:
  2. - ABC
  3. - BCD
  4. - 123
  5. a2: 这是测试
  6. a3: 5
  7. a4:
  8.   KEY1: VAL1
  9.   KEY2: VAL2
  10.   KEY3: VAL3
复制代码
 
3. 读取Yaml文件

 
读取Yaml文件,并反序列化为对应对象,如下所示:
  1. var test = YamlHelper.ReadYaml<Test>("test.yaml");
  2. Console.WriteLine(String.Join(',', test.A1));
  3. Console.WriteLine(test.A2);
  4. Console.WriteLine(test.A3);
  5. Console.WriteLine(test.A4.Count);
复制代码
 
 以上就是【.NET数据交互之生成和读取YAML文件】的全部内容,希望可以一起学习,共同进步。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表