当前位置: 首页 > news >正文

C# yaml 配置文件的用法(一)

目录

一、简介

二、yaml 的符号

1.冒号

2.短横杆

3.文档分隔符

4.保留换行符

5.注释

6.锚点

7.NULL值

8.合并


一、简介

YAML(YAML Ain't Markup Language)是一种数据序列化标准,广泛用于配置文件、数据交换和存储。YAML的设计目标是易于阅读和编写,同时也易于机器解析和生成。以下是YAML的一些关键特点和用途的介绍:

  1. 简洁性:yaml 使用缩进和简洁的语法来表示数据结构,这使得它比 XML 或 Json 等格式更易于阅读和编写。

  2. 数据类型支持:yaml 支持多种数据类型,包括标量(如字符串、整数、浮点数)、序列(列表)、映射(字典)以及复杂的数据结构。

  3. 跨语言支持:yaml 可以被多种编程语言解析和生成,包括 Python、Ruby、Java、JavaScript 等,这使得它在不同系统间的数据交换中非常有用。

  4. 配置文件:yaml 常用于编写配置文件,因为它的人类可读性和灵活性使得配置管理变得简单。例如,Docker 和Kubernetes 都使用 yaml 来定义容器和集群的配置。

  5. 文档分离:yaml 支持文档分离,即一个文件中可以包含多个独立的 yaml 文档,每个文档由三个破折号(---)分隔。

  6. 引用和锚点:YAML允许使用引用和锚点来避免数据重复,这可以提高数据的可维护性和减少错误。

  7. 兼容性:YAML可以与JSON相互转换,这意味着YAML文件可以很容易地转换为JSON格式,反之亦然。

yaml 有以下基本规则:

1. 大小写敏感。

2. 使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格键,缩进的空格数不重要,只要元素左侧能对齐就可。

3.空格,在 value 的值前边必须有空格,否则读取时会报错,比如:name:  jack,而不是 name:jack,键值对的冒号后面至少有一个空格。

4.引号,value 的值如果是字符串,可以用引号也可以不用,单引号和双引号都可以。

5. yaml 兼容 Json 的语法,插件 YamlDotNet 同样也可以读写 Json。

yaml 在读取性能上不如 Json,但在需要手写配置文件的时候,yaml 要比 Json 方便不少,不用添加那么多对称的大括号(花括号)和中括号(方括号),读起来也更简单易懂,并且在多个编程语言中都是通用的。

文章的第二部分:

C# yaml 配置文件的用法(二)-CSDN博客

二、yaml 的符号

这里只介绍几个常用的符号,这不是 yaml 所有运算符,有需要的可以参考官方文档 The Official YAML Web Site

在使用 C# 进行读写时,需要安装一个插件 YamlDotNet

YamlDotNet 是开源的,github 可以找到对应的源码。

1.冒号

( : )冒号用于键值对的分隔,冒号后必须跟一个空格

username: admin  
password: 123456

C# 实例:

using System;
using System.Collections.Generic;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml = 
@"
name: zhangsan
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<Dictionary<string, object>>(yaml);string name = data["name"] as string;Console.WriteLine("名字:{0}", name);Console.ReadKey();}}
}

运行:

2.短横杆

( - )短横杆用于表示列表(数组)的开始

fruits:  - Apple  - Banana  - Cherry

C# 实例:

using System;
using System.Collections.Generic;
using System.Linq;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
fruits:  - Apple  - Banana  - Cherry
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<Dictionary<string, object>>(yaml);if (data.ContainsKey("fruits") && data["fruits"] is IList<object> fruitsList){string[] fruitsArray = fruitsList.Cast<string>().ToArray();Console.WriteLine(string.Join(", ", fruitsArray));}Console.ReadKey();}}
}

运行:

3.文档分隔符

使用三个连字符(---)表示一个YAML文档的开始,可选地使用三个点(...)表示文档的结束(但在实践中通常省略)。

---  
# 第一个文档  
username: admin  
---  
# 第二个文档  
name: Project A  
description: A new project  
...

4.保留换行符

| 和 > 用于处理多行字符串,其中 | 保留字符串的换行符,而 > 将换行符转换为空格。

poem: |  胜日寻芳泗水滨,无边光景一时新。等闲识得东风面,万紫千红总是春。description: >  风和日丽之时游览在泗水之滨,无边无际的风光让人耳目一新。谁都可以看出春的面貌,万紫千红,到处都是百花开放的春景。

C# 实例:

using System;
using System.Collections.Generic;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
poem: |  胜日寻芳泗水滨,无边光景一时新。等闲识得东风面,万紫千红总是春。description: >  风和日丽之时游览在泗水之滨,无边无际的风光让人耳目一新。谁都可以看出春的面貌,万紫千红,到处都是百花开放的春景。
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<Dictionary<string, object>>(yaml);string poem = data["poem"] as string;Console.WriteLine(poem);Console.WriteLine("===============");string description = data["description"] as string;Console.WriteLine(description);Console.ReadKey();}}
}

运行:

5.注释

使用井号(#)进行单行注释。

#这是一个注释  
username: admin  
password: 123456  #密码 

6.锚点

如果你有一个值需要在多个地方重复使用,可以使用 yaml 的锚点和别名功能来避免重复写入。锚点(&)用于标记一个节点,而别名(*)用于引用这个锚点。

比如下面的案例中,ip 这个值需要在很多的地方用到,我们就可以使用 &ip 来标记一个锚点,然后使用 *ip 来引用。

ipAddress: &ip '192.168.1.1'server1:name: 'Server 1'ip: *ipserver2:name: 'Server 2'ip: *ipserver3:name: 'Server 3'ip: *ip

C# 实例:

using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
ipAddress: &ip '192.168.1.1'
server1:name: 'Server 1'ip: *ip
server2:name: 'Server 2'ip: *ip
server3:name: 'Server 3'ip: *ip
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var config = deserializer.Deserialize<ServersConfig>(yaml);Console.WriteLine($"Server 1: Name = {config.Server1.Name}, IP = {config.Server1.Ip}");Console.WriteLine($"Server 2: Name = {config.Server2.Name}, IP = {config.Server2.Ip}");Console.WriteLine($"Server 3: Name = {config.Server3.Name}, IP = {config.Server3.Ip}");Console.ReadKey();}}
}public class Server
{public string Name { get; set; }public string Ip { get; set; }
}public class ServersConfig
{public string IpAddress { get; set; }public Server Server1 { get; set; }public Server Server2 { get; set; }public Server Server3 { get; set; }
}

运行:

由于 yaml 不支持字符串的拼接,只能在编程语言中自行合并,如果确实有这个需求的话,只能在 yaml 中使用编程语言更加方便的读取方式,比如数组,yaml 数组中也是支持使用瞄点的。

ipAddress: &ip 'http://192.168.1.1'
server1:name: 'Server 1'ip: [*ip,'/biz/getVersion']
server2:name: 'Server 2'ip: [*ip, '/biz/getName']
server3:name: 'Server 3'ip: [*ip, '/biz/getAge']

C# 实例:

using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
ipAddress: &ip 'http://192.168.1.1'
server1:name: 'Server 1'ip: [*ip,'/biz/getVersion']
server2:name: 'Server 2'ip: [*ip, '/biz/getName']
server3:name: 'Server 3'ip: [*ip, '/biz/getAge']
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var config = deserializer.Deserialize<ServersConfig>(yaml);Console.WriteLine($"Server 1: Name = {config.Server1.Name}, IP = {string.Join("", config.Server1.Ip)}");Console.WriteLine($"Server 2: Name = {config.Server2.Name}, IP = {string.Join("", config.Server2.Ip)}");Console.WriteLine($"Server 3: Name = {config.Server3.Name}, IP = {string.Join("", config.Server3.Ip)}");Console.ReadKey();}}
}public class Server
{public string Name { get; set; }public string[] Ip { get; set; }
}public class ServersConfig
{public string IpAddress { get; set; }public Server Server1 { get; set; }public Server Server2 { get; set; }public Server Server3 { get; set; }
}

运行:

7.NULL值

可以用 ~null 来表示空值。例如:

value: ~
another_value: null

C# 实例:

using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
value: ~
another_value: null            
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<dynamic>(yaml);string value = data["value"];string another_value = data["another_value"];Console.WriteLine("value:{0}", value);Console.WriteLine("another_value:{0}", another_value);Console.ReadKey();}}
}

运行:

断点看看

8.合并

<<  是一个合并的语法,用于将一个映射(字典)的内容合并到另一个映射中。这种语法通常与锚和别名一起使用,以便重用和继承。

defaults: &defaultsname: Johnage: 30person1:<<: *defaults  # 合并 defaults 的内容location: USAperson2:<<: *defaults  # 合并 defaults 的内容location: Canada

合并后的结构将是:

person1:name: Johnage: 30location: USAperson2:name: Johnage: 30location: Canada

由于插件 YamlDotNet 目前并不支持合并语法(<<),所以这里就不做演示了,但它不代表所有编程语言都不支持合并语法,在有些编程语言中它是支持的,比如:Python 

文章的第二部:

C# yaml 配置文件的用法(二)-CSDN博客

相关文章:

C# yaml 配置文件的用法(一)

目录 一、简介 二、yaml 的符号 1.冒号 2.短横杆 3.文档分隔符 4.保留换行符 5.注释 6.锚点 7.NULL值 8.合并 一、简介 YAML&#xff08;YAML Aint Markup Language&#xff09;是一种数据序列化标准&#xff0c;广泛用于配置文件、数据交换和存储。YAML的设计目标是…...

人工智能与机器学习原理精解【4】

文章目录 马尔科夫过程论要点理论基础σ代数定义性质应用例子总结 马尔可夫过程概述一、马尔可夫过程的原理二、马尔可夫过程的算法过程三、具体例子 马尔可夫链的状态转移概率矩阵一、确定马尔可夫链的状态空间二、收集状态转移数据三、计算转移频率四、构建状态转移概率矩阵示…...

Go channel实现原理详解(源码解读)

文章目录 Go channel详解Channel 的发展Channel 的应用场景Channel 基本用法Channel 的实现原理chan 数据结构初始化sendrecvclose使用 Channel 容易犯的错误总结Go channel详解 Channel 是 Go 语言内建的 first-class 类型,也是 Go 语言与众不同的特性之一。Channel 让并发消…...

数据结构-C语言-排序(4)

代码位置&#xff1a; test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排…...

灰色关联分析【系统分析+综合评价】

系统分析&#xff1a; 判断哪个因素影响最大 基本思想&#xff1a;根据序列曲线几何形状的相似程度来判断其练习是否紧密 绘制统计图并进行分析 确定子序列和母序列 对变量进行预处理&#xff08;去量纲、缩小变量范围&#xff09; 熟练使用excel与其公式和固定&#xff08…...

linux 部署flask项目

linux python环境安装: https://blog.csdn.net/weixin_41934979/article/details/140528410 1.创建虚拟环境 python3.12 -m venv .venv 2.激活环境 . .venv/bin/activate 3.安装依赖包(pip3.12 install -r requirements.txt) pip3.12 install -r requirements.txt 4.测试启…...

ES6 数值的扩展(十八)

1. 二进制和八进制字面量 特性&#xff1a;可以直接在代码中使用二进制&#xff08;0b 或 0B&#xff09;和八进制&#xff08;0o 或 0O&#xff09;字面量。 用法&#xff1a;简化二进制和八进制数值的表示。 const binaryNumber 0b1010; // 二进制表示 10 const octalNumb…...

面试知识储备-redis和redission

1.redis的使用 引入依赖&#xff0c;自动注解redistemplate即可使用&#xff0c; 默认的redistemplate存入到redis中是字符流的形式&#xff0c;需要配置redistemplate&#xff0c; 如果不想配置&#xff0c;可以使用stringRedistemplate 可以使用string类型&#xff0c;但是…...

【5本可选】保证知网检索,现在投稿可在8月见刊,对文科领域友好

AEPH出版社旗下有5本学术期刊&#xff0c;专门出版自然科学、社会科学研究与教育领域论文的高影响力期刊&#xff0c;拥有正规ISSN号&#xff0c;出版类型涉及应用和理论方面的原创和未曾公开发表的研究论文&#xff0c;分配独立DOI号。 期刊1 Philosophy and Social Science…...

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

在本文中&#xff0c;我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的&#xff0c;因为我发现有些java的初学者&#xff0c;甚至工作10年的老员工居然并不会新建一个SpringBoot项目&#xff0c;所以特别出了一篇文章来教大家新建一个SpringBoo…...

数据恢复篇:适用于 Android 视频恢复的 6 个工具

在智能手机这个动态的世界里&#xff0c;每一刻都被捕捉并以数字方式存储&#xff0c;丢失珍贵的视频可能是一种令人心碎的经历。不必担心&#xff0c;因为 Android 生态系统提供了大量旨在挽救这些珍贵回忆的视频恢复应用程序。 这些应用程序是强大的工具&#xff0c;旨在挽救…...

Android笔试面试题AI答之控件Views(6)

答案来着文心一言&#xff0c;仅供参考 目录 1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结 2.获取View宽高的几种方法?1. 在onWindowFocusChanged方法中获取2. 使用ViewTreeObserver.OnGlobalLayoutListener3. 使用ViewTreeObserver.OnPreDrawLi…...

扭蛋机潮玩小程序搭建,扭蛋机行业的创新

在当下潮玩市场中&#xff0c;扭蛋机具有盲盒的未知性和惊喜体验感&#xff0c;商品丰富&#xff0c;并且价格相对低廉&#xff0c;获得了极高的人气。年轻人开始对扭蛋机逐渐“上头”&#xff0c;为了扭到喜欢的商品不断地进行复购下单&#xff0c;在这场随机性的扭蛋游戏中&a…...

supOS赋能千行百业

推进制造业数字化转型是促进数字经济和实体经济深度融合的重点领域。在长期摸索和实践过程中&#xff0c;蓝卓打造了工厂操作系统、行业云操作系统、产业大脑操作系统三大产品&#xff0c;形成了企业侧、行业侧、产业侧的立体化赋能体系&#xff0c;全面赋能工业企业&#xff0…...

Vue中filter的使用

在 Vue.js 中&#xff0c;filter() 方法用于创建一个新数组&#xff0c;其中包含通过所提供函数实现的测试的所有元素。filter() 不会改变原数组&#xff0c;而是返回一个新的数组。 语法 array.filter(callback(element[, index[, array]])[, thisArg])callback&#xff1a;…...

案例研究|柯尼卡美能达软件开发(大连)有限公司基于DataEase构筑内部数据可视化体系

柯尼卡美能达软件开发&#xff08;大连&#xff09;有限公司于2007年5月25日注册成立。公司以“洞悉在工作的人们真实情况&#xff0c;探寻他们的愿望&#xff0c;持续提供使人们更加幸福的服务”为使命&#xff0c;致力于系统品质测试服务、软件开发服务、IT安全服务、高级BPO…...

PHP框架详解- symfony框架

文心一言 Symfony框架是一个用PHP语言编写的开放源代码的Web应用框架&#xff0c;旨在加速Web应用程序的开发过程&#xff0c;提高代码的可维护性和可扩展性。以下是对Symfony框架的详细解析&#xff1a; 一、框架概述 起源与开发者&#xff1a; Symfony由SensioLabs&#…...

springboot系列十一:Thymeleaf

文章目录 官方文档基本介绍Thymeleaf机制说明Thymeleaf语法表达式运算符th属性迭代条件运算使用Thymeleaf th属性需要注意点 Thymeleaf综合案例需求说明思路分析代码实现 作业布置 官方文档 在线文档: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 离线…...

51单片机嵌入式开发:12、STC89C52RC 红外解码数码管显示

STC89C52RC 红外解码数码管显示 1 概述2 HX1838原理2.1 原理概述2.2 原理概述 3 HX1838代码实现3.1 工程整理3.2 工程代码3.3 演示 4 HX1838总结 1 概述 HX1838是一种常见的红外接收模块&#xff0c;用于接收和解码红外遥控器发送的红外信号。 HX1838具有以下特点和功能&#…...

数据结构--二叉树详解

一&#xff0c;概念 1&#xff0c;结点的度&#xff1a;一个结点含有子树的个数称为该结点的度 2&#xff0c; 树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 3&#xff0c;叶子结点或终端结点&#xff1a;度为0的结点称为叶结点&#x…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...