最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#常用類庫YamlDotNet詳解

 更新時(shí)間:2026年03月20日 09:02:54   作者:阿蒙Armon  
YamlDotNet是C#處理YAML數(shù)據(jù)的最優(yōu)選擇,其易用性、靈活性和兼容性,能完美適配配置文件、數(shù)據(jù)交換等各類場景,本文介紹C#常用類庫YamlDotNet詳解,感興趣的朋友跟隨小編一起看看吧

在C#開發(fā)中,數(shù)據(jù)序列化與反序列化是高頻需求,廣泛應(yīng)用于配置文件、數(shù)據(jù)傳輸、日志存儲(chǔ)等場景。YAML作為簡潔易讀的非標(biāo)記語言,相比XML繁瑣、JSON緊湊的特點(diǎn),更適合作為配置文件和高可讀性的數(shù)據(jù)交換格式。而YamlDotNet作為C#生態(tài)最主流的YAML處理類庫,開源免費(fèi)、功能強(qiáng)大,是處理YAML數(shù)據(jù)的首選工具。本文聚焦實(shí)戰(zhàn),從核心定位、環(huán)境搭建、基礎(chǔ)用法到進(jìn)階技巧,幫你快速掌握YamlDotNet全流程用法。

一、YamlDotNet 核心定位與優(yōu)勢

YamlDotNet是基于MIT許可證的開源C#類庫,核心功能是實(shí)現(xiàn).NET對象與YAML格式的雙向轉(zhuǎn)換(序列化/反序列化),底層封裝了YAML語法解析器與生成器,提供簡潔API,支持自定義規(guī)則,適配復(fù)雜業(yè)務(wù)場景。

1. 核心優(yōu)勢

  • 開源免費(fèi):可自由用于商業(yè)項(xiàng)目,源碼可定制,社區(qū)活躍,適配.NET全框架(.NET Framework 4.5+、.NET Core 2.0+、.NET 5+)。
  • 功能完整:支持基本類型、自定義類、集合、泛型、繼承類的序列化/反序列化,兼容YAML 1.1和1.2規(guī)范。
  • 靈活可擴(kuò)展:支持自定義序列化規(guī)則、屬性映射、忽略指定屬性、保留注釋,適配復(fù)雜業(yè)務(wù)場景。
  • 兼容性強(qiáng):跨平臺(tái)支持(Windows、Linux、macOS),無第三方依賴,集成簡單。
  • 性能優(yōu)異:解析速度快、內(nèi)存占用低,支持大數(shù)據(jù)量YAML文檔處理,滿足企業(yè)級(jí)需求。

2. 與其他序列化類庫選型對比

類庫核心優(yōu)勢不足選型建議
YamlDotNet專注YAML,易用性強(qiáng)、擴(kuò)展靈活,支持注釋和復(fù)雜類型序列化速度略遜于Newtonsoft.Json,不支持JSON配置文件、高可讀性數(shù)據(jù)交換首選
Newtonsoft.Json速度快、功能豐富、生態(tài)完善,專注JSON不支持YAML,配置文件可讀性差JSON數(shù)據(jù)傳輸、接口交互場景
System.Xml.Serialization內(nèi)置無依賴,適配傳統(tǒng)XML配置語法繁瑣、擴(kuò)展性低,不支持YAML舊項(xiàng)目XML配置兼容場景
SharpYaml輕量、解析快,支持YAML 1.2社區(qū)活躍低、高級(jí)功能不完善簡單YAML解析場景,不推薦復(fù)雜項(xiàng)目

3. 核心應(yīng)用場景

  • 配置文件:替代XML、JSON,作為appsettings.yaml等配置文件,便于人工編輯。
  • 數(shù)據(jù)交換:微服務(wù)、跨語言項(xiàng)目中,作為高可讀性的數(shù)據(jù)交換格式。
  • 日志存儲(chǔ):將復(fù)雜日志對象序列化為YAML,便于分析查看。
  • 文檔生成:生成YAML格式接口文檔、K8s配置文件等。
  • 數(shù)據(jù)導(dǎo)入導(dǎo)出:實(shí)現(xiàn)系統(tǒng)數(shù)據(jù)的備份與恢復(fù)。

二、環(huán)境搭建:快速集成YamlDotNet

YamlDotNet為第三方類庫,需通過NuGet安裝,搭建流程簡單,適配所有.NET版本。

1. 安裝方式(3種任選)

方式1:NuGet界面安裝

Visual Studio → 右鍵項(xiàng)目 → 管理NuGet程序包 → 搜索“YamlDotNet” → 安裝最新穩(wěn)定版。

方式2:Package Manager Console命令

Install-Package YamlDotNet -Version 13.7.1 # 可替換為最新版本

方式3:手動(dòng)修改.csproj文件

<ItemGroup>
  <PackageReference Include="YamlDotNet" Version="13.7.1" />
</ItemGroup>

2. 引入命名空間

using YamlDotNet;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

3. 環(huán)境驗(yàn)證

編寫簡單代碼,驗(yàn)證序列化與反序列化功能是否正常:

// 1. 定義測試類
public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public List<string> Hobbies { get; set; }
}
// 2. 序列化(對象→YAML)
var user = new User { Name = "ZhangSan", Age = 25, Hobbies = new List<string> { "Coding", "Reading" } };
var serializer = new SerializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .Build();
string yaml = serializer.Serialize(user);
Console.WriteLine("序列化結(jié)果:\n" + yaml);
// 3. 反序列化(YAML→對象)
var deserializer = new DeserializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .IgnoreUnmatchedProperties()
    .Build();
User deserializedUser = deserializer.Deserialize<User>(yaml);
Console.WriteLine($"反序列化結(jié)果:Name={deserializedUser.Name}, Age={deserializedUser.Age}");

運(yùn)行程序,正常輸出結(jié)果即說明環(huán)境搭建成功。

三、基礎(chǔ)實(shí)戰(zhàn):核心用法(序列化+反序列化)

YamlDotNet的核心的是序列化與反序列化,以下覆蓋常用場景,代碼可直接復(fù)制使用。

1. 通用配置

序列化器與反序列化器的常用配置,統(tǒng)一配置可提升代碼復(fù)用性:

// 序列化器配置
var serializer = new SerializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance) // 駝峰命名
    .Indent(2) // 縮進(jìn)2個(gè)空格
    .WithCommentHandling(CommentHandling.IncludeComments) // 保留注釋
    .Build();
// 反序列化器配置
var deserializer = new DeserializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .IgnoreUnmatchedProperties() // 忽略未知屬性,避免報(bào)錯(cuò)
    .AllowNullValues() // 允許空值
    .Build();

2. 基本類型與集合

支持string、int、DateTime等基本類型,以及List、Dictionary等集合:

var data = new
{
    Name = "LiSi",
    Age = 30,
    BirthDate = new DateTime(1993, 10, 1),
    Tags = new string[] { "C#", "YamlDotNet" },
    Scores = new Dictionary<string, int> { { "Math", 90 }, { "English", 85 } }
};
// 序列化
string yaml = serializer.Serialize(data);
// 反序列化(dynamic類型,無需定義實(shí)體類)
dynamic deserialized = deserializer.Deserialize<dynamic>(yaml);
Console.WriteLine($"Math Score: {deserialized.scores.math}");

3. 自定義類(重點(diǎn))

支持自定義類、繼承類、嵌套類的序列化與反序列化:

// 嵌套類
public class Address { public string Province { get; set; } public string City { get; set; } }
// 父類
public class Person { public string Name { get; set; } public int Age { get; set; } }
// 子類
public class Student : Person
{
    public string StudentId { get; set; }
    public Address Address { get; set; }
    public List<string> Courses { get; set; }
}
// 序列化
var student = new Student
{
    Name = "WangWu",
    Age = 20,
    StudentId = "2023001",
    Address = new Address { Province = "Guangdong", City = "Shenzhen" },
    Courses = new List<string> { "C#", "Database" }
};
string studentYaml = serializer.Serialize(student);
// 反序列化
Student deserializedStudent = deserializer.Deserialize<Student>(studentYaml);

4. 特性用法(自定義規(guī)則)

通過特性自定義單個(gè)屬性的序列化規(guī)則,靈活適配需求:

using YamlDotNet.Serialization.Attributes;
public class Product
{
    [YamlAlias("product_id")] // 別名,YAML中顯示為product_id
    public string Id { get; set; }
    [YamlIgnore] // 忽略該屬性,不序列化/反序列化
    public string Secret { get; set; }
    [YamlComment("產(chǎn)品名稱(必填)")] // 添加注釋
    public string Name { get; set; }
    [YamlMember(Order = 1)] // 指定序列化順序
    public decimal Price { get; set; }
}

四、進(jìn)階實(shí)戰(zhàn):企業(yè)級(jí)優(yōu)化技巧

基礎(chǔ)用法可滿足簡單場景,企業(yè)級(jí)項(xiàng)目需解決復(fù)雜類型、性能、穩(wěn)定性等問題,以下是核心技巧。

1. 自定義類型轉(zhuǎn)換器

針對DateTime、Enum等復(fù)雜類型,自定義轉(zhuǎn)換規(guī)則(以DateTime格式化為例):

// 實(shí)現(xiàn)自定義轉(zhuǎn)換器
public class CustomDateTimeConverter : IYamlTypeConverter
{
    public bool Accepts(Type type) => type == typeof(DateTime) || type == typeof(DateTime?);
    // 反序列化:字符串→DateTime
    public object ReadYaml(IParser parser, Type type)
    {
        var value = parser.Consume<Scalar>().Value;
        return DateTime.ParseExact(value, "yyyy-MM-dd HH:mm:ss", null);
    }
    // 序列化:DateTime→字符串
    public void WriteYaml(IEmitter emitter, object value, Type type)
    {
        emitter.Emit(new Scalar(((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss")));
    }
}
// 注冊并使用
var serializer = new SerializerBuilder()
    .WithTypeConverter(new CustomDateTimeConverter())
    .Build();

2. YAML文件讀寫(實(shí)戰(zhàn)常用)

封裝工具方法,實(shí)現(xiàn)對象與YAML文件的雙向讀寫:

/// <summary>
/// 序列化對象到Y(jié)AML文件
/// </summary>
public void SerializeToFile(object obj, string filePath)
{
    using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
    {
        serializer.Serialize(writer, obj);
    }
}
/// <summary>
/// 從YAML文件反序列化到對象
/// </summary>
public T DeserializeFromFile<T>(string filePath)
{
    if (!File.Exists(filePath)) throw new FileNotFoundException("YAML文件不存在", filePath);
    using (var reader = new StreamReader(filePath, Encoding.UTF8))
    {
        return deserializer.Deserialize<T>(reader);
    }
}

3. 異常處理與性能優(yōu)化

(1)異常處理

完善異常處理,避免程序崩潰,提升穩(wěn)定性:

public T DeserializeWithExceptionHandling<T>(string yaml)
{
    try
    {
        return deserializer.Deserialize<T>(yaml);
    }
    catch (YamlException ex)
    {
        Console.WriteLine($"YAML語法錯(cuò)誤:{ex.Message},行號(hào):{ex.Start.Line}");
        return default;
    }
    catch (InvalidCastException ex)
    {
        Console.WriteLine($"類型轉(zhuǎn)換錯(cuò)誤:{ex.Message}");
        return default;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"反序列化失?。簕ex.Message}");
        return default;
    }
}

(2)性能優(yōu)化(大數(shù)據(jù)量場景)

  • 使用Stream讀寫,減少內(nèi)存占用;
  • 復(fù)用序列化器/反序列化器實(shí)例(單例模式);
  • 禁用不必要的功能(如注釋處理);
  • 避免使用dynamic類型,優(yōu)先使用具體類型。

五、避坑指南與最佳實(shí)踐

1. 常見坑與解決方案

  • 坑1:YAML語法錯(cuò)誤:縮進(jìn)用空格(不支持Tab),冒號(hào)、橫杠后必須加空格;用在線工具校驗(yàn)語法。
  • 坑2:命名不一致:序列化與反序列化配置相同的命名約定,或用[YamlAlias]指定別名。
  • 坑3:復(fù)雜類型格式不符:實(shí)現(xiàn)自定義類型轉(zhuǎn)換器,或使用內(nèi)置配置。
  • 坑4:未知屬性報(bào)錯(cuò):配置IgnoreUnmatchedProperties()忽略未知屬性。
  • 坑5:大數(shù)據(jù)量性能差:用Stream、復(fù)用實(shí)例、禁用注釋處理。

2. 最佳實(shí)踐

  • 統(tǒng)一命名約定,保持序列化與反序列化配置一致;
  • 復(fù)用序列化器/反序列化器實(shí)例,提升性能;
  • 敏感字段用[YamlIgnore]忽略,關(guān)鍵屬性加注釋;
  • 配置文件場景保留注釋,便于維護(hù);
  • 序列化后校驗(yàn)YAML語法,避免反序列化失敗。

六、企業(yè)級(jí)實(shí)戰(zhàn)案例:配置文件讀寫工具

結(jié)合前文知識(shí)點(diǎn),實(shí)現(xiàn)可直接復(fù)用的YAML配置讀寫工具,適配項(xiàng)目全局配置場景。

1. 項(xiàng)目結(jié)構(gòu)

YamlConfigDemo/
├─ Config/
│  ├─ AppConfig.cs(配置實(shí)體)
│  └─ YamlConfigHelper.cs(工具類)
├─ appsettings.yaml(配置文件)
└─ Program.cs(測試入口)

2. 核心代碼

(1)配置實(shí)體類(AppConfig.cs)

using YamlDotNet.Serialization.Attributes;
namespace YamlConfigDemo.Config
{
    public class AppConfig
    {
        [YamlComment("應(yīng)用名稱(必填)")]
        public string AppName { get; set; }
        [YamlComment("應(yīng)用版本")]
        public string Version { get; set; }
        [YamlComment("數(shù)據(jù)庫配置")]
        public DatabaseConfig Database { get; set; }
        [YamlComment("服務(wù)配置")]
        public ServiceConfig Service { get; set; }
    }
    public class DatabaseConfig
    {
        [YamlAlias("connection_string")]
        public string ConnectionString { get; set; }
        [YamlAlias("timeout")]
        public int Timeout { get; set; } = 30;
    }
    public class ServiceConfig
    {
        [YamlAlias("base_url")]
        public string BaseUrl { get; set; }
        [YamlAlias("timeout")]
        public int Timeout { get; set; } = 5000;
    }
}

(2)配置讀寫工具類(YamlConfigHelper.cs)

using System.IO;
using System.Text;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace YamlConfigDemo.Config
{
    public static class YamlConfigHelper
    {
        // 單例復(fù)用實(shí)例
        private static readonly Serializer _serializer;
        private static readonly Deserializer _deserializer;
        static YamlConfigHelper()
        {
            _serializer = new SerializerBuilder()
                .WithNamingConvention(CamelCaseNamingConvention.Instance)
                .WithCommentHandling(CommentHandling.IncludeComments)
                .Indent(4)
                .Build();
            _deserializer = new DeserializerBuilder()
                .WithNamingConvention(CamelCaseNamingConvention.Instance)
                .IgnoreUnmatchedProperties()
                .AllowNullValues()
                .Build();
        }
        // 讀取配置
        public static T ReadConfig<T>(string filePath)
        {
            if (!File.Exists(filePath)) throw new FileNotFoundException("配置文件不存在", filePath);
            using (var reader = new StreamReader(filePath, Encoding.UTF8))
            {
                return _deserializer.Deserialize<T>(reader);
            }
        }
        // 寫入配置
        public static void WriteConfig(object config, string filePath)
        {
            using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
            {
                _serializer.Serialize(writer, config);
            }
        }
    }
}

(3)測試使用(Program.cs)

using YamlConfigDemo.Config;
// 寫入配置
var config = new AppConfig
{
    AppName = "YamlDotNetDemo",
    Version = "1.0.0",
    Database = new DatabaseConfig
    {
        ConnectionString = "Server=localhost;Database=Test;Uid=root;Pwd=123456;"
    },
    Service = new ServiceConfig
    {
        BaseUrl = "https://api.demo.com"
    }
};
YamlConfigHelper.WriteConfig(config, "appsettings.yaml");
// 讀取配置
var readConfig = YamlConfigHelper.ReadConfig<AppConfig>("appsettings.yaml");
Console.WriteLine($"應(yīng)用名稱:{readConfig.AppName}");
Console.WriteLine($"數(shù)據(jù)庫連接串:{readConfig.Database.ConnectionString}");

總結(jié)

YamlDotNet是C#處理YAML數(shù)據(jù)的最優(yōu)選擇,其易用性、靈活性和兼容性,能完美適配配置文件、數(shù)據(jù)交換等各類場景。本文從基礎(chǔ)到進(jìn)階,覆蓋環(huán)境搭建、核心用法、優(yōu)化技巧和實(shí)戰(zhàn)案例,代碼可直接復(fù)用。掌握本文內(nèi)容,可輕松解決YAML序列化/反序列化的各類問題,提升開發(fā)效率。

到此這篇關(guān)于C#常用類庫YamlDotNet詳解的文章就介紹到這了,更多相關(guān)C#常用類庫YamlDotNet內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C#分析URL參數(shù)并獲取參數(shù)和值對應(yīng)列表的方法

    C#分析URL參數(shù)并獲取參數(shù)和值對應(yīng)列表的方法

    這篇文章主要介紹了C#分析URL參數(shù)獲取參數(shù)和值對應(yīng)列表的方法,涉及C#進(jìn)行URL分析及正則表達(dá)式的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#中DataTable刪除行的方法分析

    C#中DataTable刪除行的方法分析

    這篇文章主要介紹了C#中DataTable刪除行的方法,包括了常見的幾種刪除方法的分析,需要的朋友可以參考下
    2014-09-09
  • C#位運(yùn)算以及實(shí)例計(jì)算詳解

    C#位運(yùn)算以及實(shí)例計(jì)算詳解

    這篇文章主要給大家介紹了關(guān)于C#位運(yùn)算以及實(shí)例計(jì)算的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)

    c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)

    這篇文章主要介紹了c# WinForm制作圖片編輯工具(可實(shí)現(xiàn)圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • c#正反序列化XML文件示例(xml序列化)

    c#正反序列化XML文件示例(xml序列化)

    這篇文章主要介紹了c#正反序列化XML文件示例,可以將對象序列化為XML文本或者文件,或者將XML文件或文本反序列化為對象,要求進(jìn)行序列化的對象不能出現(xiàn)序列化異常,支持類的嵌套,要求類的屬性為public
    2014-03-03
  • 簡單談?wù)凜#中深拷貝、淺拷貝

    簡單談?wù)凜#中深拷貝、淺拷貝

    深拷貝和淺拷貝都是對對象進(jìn)行的拷貝復(fù)制。而他們的不同就在于:一個(gè)對象中可能會(huì)有值類型的字段,也可能會(huì)有引用類型的字段。淺拷貝直接拷貝值、引用類型的指針。而深拷貝則是重新構(gòu)造字段指針?biāo)赶虻膶ο螅]有拷貝該字段的指針,或是與該字段指針指向同一塊內(nèi)存
    2015-06-06
  • C# 開發(fā)step步驟條控件詳解

    C# 開發(fā)step步驟條控件詳解

    本篇文章主要介紹了用C#來實(shí)現(xiàn)一個(gè)step控件的方法步驟,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • C#實(shí)現(xiàn)獲取文件夾大小的方法

    C#實(shí)現(xiàn)獲取文件夾大小的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)獲取文件夾大小的方法,實(shí)例分析了兩種獲取方法,涉及C#針對文件夾操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#?WPF數(shù)據(jù)綁定模板化操作的完整步驟

    C#?WPF數(shù)據(jù)綁定模板化操作的完整步驟

    WPF中的數(shù)據(jù)綁定提供了很強(qiáng)大的功能,與普通的WinForm程序相比,其綁定功能為我們提供了很多便利,下面這篇文章主要給大家介紹了關(guān)于C#?WPF數(shù)據(jù)綁定模板化操作的完整步驟,需要的朋友可以參考下
    2022-01-01
  • C#表達(dá)式樹Expression基礎(chǔ)講解

    C#表達(dá)式樹Expression基礎(chǔ)講解

    這篇文章介紹了C#表達(dá)式樹Expression和基本用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論

沁源县| 霸州市| 长岛县| 库伦旗| 济宁市| 乳源| 绥江县| 禄丰县| 资源县| 兴安县| 华容县| 潜山县| 西盟| 泰州市| 澄城县| 左云县| 兴隆县| 施秉县| 安图县| 泗水县| 沂水县| 扶绥县| 吴旗县| 锦屏县| 南投市| 正蓝旗| 鄂托克旗| 罗山县| 巢湖市| 嘉善县| 明光市| 张掖市| 芷江| 峨眉山市| 邯郸市| 策勒县| 云浮市| 萝北县| 湖南省| 凤凰县| 安新县|