首页 > 其他分享 >.NET数据交互之生成和读取YAML文件

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

时间:2024-05-31 22:13:02浏览次数:22  
标签:读取 Yaml YAML test NET public string

最近在项目中,业务上需要与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数组结构类似,数组元素使用“-”开头,也可以根据缩进进行数组嵌套。如下所示:

#行内写法: 
k: [v1,v2,v3]
#或者
k:
 - v1
 - v2
 - v3

 

2. 对象示例

 

对象【map,hash,set,object】表示一组键值对,使用冒号结构表示。类似Python中的字典数据结构。

platformName: Android
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类进行构建反序列号接口,然后再反序列化,如下所示:

public static T ReadYaml<T>(string file)
{
	var target = DeserializeFromFile<T>(file);
	return target;
}

public static T Deserialize<T>(string yaml)
{
	IDeserializer _deserializer = new DeserializerBuilder().WithNamingConvention(UnderscoredNamingConvention.Instance).Build();
	return _deserializer.Deserialize<T>(yaml);
}

public static T DeserializeFromFile<T>(string filePath)
{
	var yaml = File.ReadAllText(filePath, Encoding.UTF8);
	return Deserialize<T>(yaml);
}

 

2. 写入

 

向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;
}

 

测试验证

 

1. 首先创建Test类

 

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; }

}

 

2. 构造数据并调用YAML帮助类

 

 构造数据并调用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>("test.yaml", test);

生成的Yaml文件,如下所示:

a1:
- ABC
- BCD
- 123
a2: 这是测试
a3: 5
a4:
  KEY1: VAL1
  KEY2: VAL2
  KEY3: VAL3

 

3. 读取Yaml文件

 

读取Yaml文件,并反序列化为对应对象,如下所示:

var test = YamlHelper.ReadYaml<Test>("test.yaml");
Console.WriteLine(String.Join(',', test.A1));
Console.WriteLine(test.A2);
Console.WriteLine(test.A3);
Console.WriteLine(test.A4.Count);

 

 以上就是【.NET数据交互之生成和读取YAML文件】的全部内容,希望可以一起学习,共同进步。

标签:读取,Yaml,YAML,test,NET,public,string
From: https://www.cnblogs.com/hsiang/p/18223508

相关文章

  • request+pytest根据yaml文件发送请求
    request怎么跟pytest结合起来,然后根据yaml文件去发一个基本的请求呢?下面是一个简单的示例。1、先新建一个名为“demo.yaml”的yaml文件,用来存放测试数据的。-name:G广州研发中心parentid:1#第一次用例的数据正常expect:60008#对请求结果进行断言-nam......
  • .NET能做什么
    一文带你了解.NET能做什么? 前言在DotNetGuide技术社区微信交流群经常看到有小伙伴问:.NET除了能写桌面应用和Web应用还能做什么?今天大姚将通过本篇文章来简单讲讲.NET能做哪些开发,对.NET感兴趣的小伙伴也可以自行领取文末附带的.NET相关学习资料。.NET简单介绍.NET是一个开......
  • DecoupleR/CollecTRI network-单细胞转录因子活性分析
    DecoupleR包是一个可以从组学数据中分析内部生物学活性的计算方法集合。该R包内部收纳了11种分析方法,包括GSVA,GSEA,univariatelinearmodel(ULM),VIPER等。PMID:36699385根据包含的计算方法,我们也能大概的知道decoupleR包能够做哪些分析了,包括基本分析(AUCell,FastGSEA,......
  • Python读取SU数据
    SU数据格式以下简称SeismicUnix为SU。SU格式是SEGY的简化,没有前面3600字节文件头,故需要从第一道的道头获取需要的信息。这里默认所有道的采样点数即nt是一样的。SEGY和SU格式的道头都有240字节,但SEGY只有前180字节有信息,SU的181-240字节定义了画图相关......
  • EfficientNetV2深度学习记录——代码复现
    神经网络/深度学习第二章Python机器学习入门之EfficientNetV2的使用文章目录神经网络/深度学习前言一、EfficientNetV2是什么?二、EfficientNetV2代码的复现1.准备工作2.训练模型3.进行预测总结前言本文主要是复现efficientnetv2网络代码,训练自己的材质分类模型......
  • telnet HTTP测试步骤、遇到的问题和解决方法(cmd窗口)
    **本篇文章食用的简单说明**本篇文章为使用cmd窗口进行telnetHTTP测试步骤以及遇到的问题和解决方法。其中在解决方法中有文字版和图片版,文字版图片版自己选择一种查看就好(有标注)。目录点击想要查看的部分即可跳转到对应位置。目录**本篇文章食用的简单说明**---------......
  • Spire.Office 9.5.0 for .NET
    Spire.Officefor.NETisacombinationofEnterprise-LevelOffice.NETAPIofferedbyE-iceblue.ItincludesSpire.Doc,Spire.XLS,Spire.Spreadsheet,Spire.Presentation,Spire.PDF,Spire.DataExport,Spire.OfficeViewer,Spire.PDFViewer,Spire.DocViewer,Sp......
  • pytest + yaml 框架 - 70.Pycharm 设置 yaml 格式用例模板,高效写用例
    前言初学者对yaml格式不太熟悉,自己写yaml用例的时候,总是格式对不齐,或者有些关键字会忘记。于是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。pycharm设置用例模板File-SettingsLiveTemplates-python点+号选择LiveTempl......
  • 滴滴面试:谈谈你对Netty线程模型的理解?
    Netty线程模型是指Netty框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。Netty线程模型被称为Reactor(响应式)模型/模式,它是基于NIO多路复用模型的一种升级,它的核心思想是将IO事件和业务处理进行分离,使用一个或多个线程来执行任务的一种机制。......
  • .NET 6 Entity Framework Core Db First(2) 增删改查
    基础代码在Program.cs注入DemoContext新建HomeController,继承ControllerBase添加Controller特性,[ApiController] [Route("[controller]/{action=index}")]通过构造函数获取数据库上下文实例(DemoContext) 接口地址为了方便测试,这里全部使用了HttpGet,也不需要传参数1、......