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


    最近在项目中,业务上需要与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等格式文件的优点,主要有以下几种特点:

    1. 大小写敏感
    2. 使用缩进表示层级关系
    3. 缩进时不允许使用Tab键,只允许使用空格。
    4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
    5. #表示注释
    6. 字符串无需加引号,如果要加,单引号会被转义,双引号不会不转义
    7. key: value   key和value之间有空格

    YAML支持的数据类型

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

    1. 纯量(scalars):单个的、不可再分的值,数据最小的单位,不可以再分割。类似于Python中单个变量
    2. 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list),与Python的list数组结构类似,数组元素使用“-”开头,也可以根据缩进进行数组嵌套。
    3. 对象:键值对的集合,又称为映射(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(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(yaml);
    10. }
    11. public static T DeserializeFromFile<T>(string filePath)
    12. {
    13. var yaml = File.ReadAllText(filePath, Encoding.UTF8);
    14. return Deserialize(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.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.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文件】的全部内容,希望可以一起学习,共同进步。

  • 相关阅读:
    Python和BeautifulSoup库的魔力:解析TikTok视频页面
    亚马逊云科技 云技能孵化营——我的云技能之旅
    在CentOS 7系统安装StoneDB数据库
    阿晨的运维笔记 | CentOS部署Docker
    单元测试Testng
    Argo CD入门、实战指南
    Java web程序实现请求后重启服务动作
    搭建免费的ftp服务器
    基于javaweb简单的在线考试系统
    PHP包含读文件写文件
  • 原文地址:https://blog.csdn.net/fengershishe/article/details/139362271