在 .NET中解析操作Yaml文件

da8018c66ba34742b420d733c844779b.jpeg

概述:不幸的是,YAML 文件是当今所有开发人员日常生活的一部分;尽管它们非常容易出错,并且几乎不可能在没有 IDE 和架构信息的情况下进行编辑而不会经常遇到错误——向所有认为这是一个好主意的 CI 系统致以问候:事实并非如此——但我们必须接受我们必须处理它们的事实。在 .NET 中,YamlDotNet 库是处理 YAML 文件的常用选择。该库非常易于使用,并为大多数 YAML 文件提供了非常好的支持。处理 YAML 文件时,提供两种不同的选项:通过字典访问键值或反序列化为类。这两种方法都有其优点和缺点,但在大多数情况下,反序列化为类是更方便、更好的选择。YamlDotNet从 YAML 反序列化

不幸的是,YAML 文件是当今所有开发人员日常生活的一部分;尽管它们非常容易出错,并且几乎不可能在没有 IDE 和架构信息的情况下进行编辑而不会经常遇到错误——向所有认为这是一个好主意的 CI 系统致以问候:事实并非如此——但我们必须接受我们必须处理它们的事实。

在 .NET 中,YamlDotNet 库是处理 YAML 文件的常用选择。该库非常易于使用,并为大多数 YAML 文件提供了非常好的支持。

处理 YAML 文件时,提供两种不同的选项:通过字典访问键值或反序列化为类。这两种方法都有其优点和缺点,但在大多数情况下,反序列化为类是更方便、更好的选择。YamlDotNet

从 YAML 反序列化

对于类的反序列化,相应的类也是必需的;举个例子,我采用博客文章潜在标题的结构:

title: Handle Yaml Files with .NET  
description: This blog post shows a simple sample how to serialize and deserialize yaml files with .NET  
  
options:  
    isDraft: true  
    date: 2024-04-23T15:30:00Z  
author:  
    name: BEN ABT  
    twitter: https://twitter.com/Abt_Benjamin  
    linkedIn: https://www.linkedin.com/in/benjaminabt/  
    job:  
        company: Medialesson GmbH  
        description: Chief PullRequest Officer  
        website: https://media-lesson.com/

因此,类结构可以 1:1 实现:

public class BlogPost  
{  
    public string Title { get; set; } = null!;  
    public string Description { get; set; } = null!;  
    public Options Options { get; set; } = null!;  
    public Author Author { get; set; } = null!;  
    public string Content { get; set; } = null!;  
}  
public class Options  
{  
    public bool IsDraft { get; set; }  
    public DateTimeOffset Date { get; set; }  
}  
public class Author  
{  
    public string Name { get; set; } = null!;  
    public string Twitter { get; set; } = null!;  
    public string LinkedIn { get; set; } = null!;  
    public Job Job { get; set; } = null!;  
}  
public class Job  
{  
    public string Company { get; set; } = null!;  
    public string Description { get; set; } = null!;  
    public string Website { get; set; } = null!;  
}

截至目前,YamlDotNet 不支持任何记录;反序列化程序需要一个类,该类在属性中具有空构造函数和相应的 setter。

反序列化非常简单:

IDeserializer deserializer = new DeserializerBuilder()  
    .WithNamingConvention(CamelCaseNamingConvention.Instance)  
    .Build();  
  
// yamlBlogPost = string with yaml content  
BlogPost blogPost = deserializer.Deserialize<BlogPost>(yamlBlogPost);

然后,该对象将 YAML 文件中的相应值作为实例包含在内,可以照常访问。blogPost

序列化为 YAML

序列化也同样简单,只是相反:

ISerializer serializer = new SerializerBuilder()  
    .WithNamingConvention(CamelCaseNamingConvention.Instance)  
    .Build();  
  
string blogPostYaml = serializer.Serialize(blogPost);

完整示例

// --------------------------------------------------------------------
// This sample shows the handling of YAML files in .NET.
// The YamlDotNet library (https://github.com/aaubry/YamlDotNet) is used to serialize and deserialize YAML files.
// 2024-04-23 - https://schwabencode.com

// Runtime: .NET 8
// Sample Project: Console App
// Dependency: YamlDotNet

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

// --------------------------------------------------------------------
// sample Yaml-File in style of a blog post header
string yamlBlogPost =
    """
    title: Handle Yaml Files with .NET
    description: This blog post shows a simple sample how to serialize and deserialize yaml files with .NET

    options:
        isDraft: true
        date: 2024-04-23T15:30:00Z
    author:
        name: BEN ABT
        twitter: https://twitter.com/Abt_Benjamin
        linkedIn: https://www.linkedin.com/in/benjaminabt/
        job:
            company: Medialesson GmbH
            description: Chief PullRequest Officer
            website: https://media-lesson.com/
    """;

// --------------------------------------------------------------------
// deserialize string as model
IDeserializer deserializer = new DeserializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .Build();

BlogPost blogPost = deserializer.Deserialize<BlogPost>(yamlBlogPost);

// Print blog post
Console.WriteLine(new string('-', 30));
Console.WriteLine($"## Print Blog Post Object");
Console.WriteLine($"Title: {blogPost.Title}");
Console.WriteLine($"\tDescription: {blogPost.Description}");
Console.WriteLine($"Options");
Console.WriteLine($"\tIs Draft: {blogPost.Options.IsDraft}");
Console.WriteLine($"\tDate: {blogPost.Options.Date:o}");
Console.WriteLine($"Author");
Console.WriteLine($"\tName: {blogPost.Author.Name}");
Console.WriteLine($"\tTwitter: {blogPost.Author.Twitter}");
Console.WriteLine($"\tLinkedIn: {blogPost.Author.LinkedIn}");
Console.WriteLine($"\tJob");
Console.WriteLine($"\t\tCompany: {blogPost.Author.Job.Company}");
Console.WriteLine($"\t\tDescription: {blogPost.Author.Job.Description}");
Console.WriteLine($"\t\tWebsite: {blogPost.Author.Job.Website}");

// --------------------------------------------------------------------
// create yaml serializer with options
ISerializer serializer = new SerializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .Build();

string blogPostYaml = serializer.Serialize(blogPost);

Console.WriteLine(new string('-', 30));
Console.WriteLine($"## Print Blog Post Text");
Console.WriteLine(blogPostYaml);

// --------------------------------------------------------------------
// sample models as classes, records are not supported today
public class BlogPost
{
    public string Title { get; set; } = null!;
    public string Description { get; set; } = null!;
    public Options Options { get; set; } = null!;
    public Author Author { get; set; } = null!;
    public string Content { get; set; } = null!;
}
public class Options
{
    public bool IsDraft { get; set; }
    public DateTimeOffset Date { get; set; }
}
public class Author
{
    public string Name { get; set; } = null!;
    public string Twitter { get; set; } = null!;
    public string LinkedIn { get; set; } = null!;
    public Job Job { get; set; } = null!;
}
public class Job
{
    public string Company { get; set; } = null!;
    public string Description { get; set; } = null!;
    public string Website { get; set; } = null!;
}

PS:请不要使用Yaml,如果你没有必要的话。每个人都讨厌yaml。

如果你喜欢我的文章,请给我一个赞!谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
yolov7.yaml是一个配置文件,用于解析YOLOv7网络模型的结构和参数。根据引用和引用,yolov7.yaml包含两个组件结构,分别是ELAN1(backbone)和ELAN2(head)。 ELAN1(backbone)是YOLOv7网络的主干部分,它由一系列卷积层组成。具体的结构包括输入卷积层、下采样卷积层、卷积层和连接层。其,输入卷积层负责对输入数据进行初步的卷积操作,下采样卷积层用于减小特征图的尺寸,卷积层用于提取特征,连接层用于将不同层的特征图进行连接。ELAN1的结构通过引用的代码示例进行了详细描述。 ELAN2(head)是YOLOv7网络的头部部分,它也由一系列卷积层组成。ELAN2的结构包括卷积层、连接层和输出卷积层。其,卷积层用于对输入特征图进行卷积操作,连接层用于将不同层的特征图进行连接,输出卷积层用于生成最终的预测结果。ELAN2的结构通过引用的代码示例进行了详细描述。 除了ELAN1和ELAN2之外,yolov7.yaml还包含其他组件结构,如MPConv、SPP、CSP等。这些组件结构在YOLOv7网络起着不同的作用,用于增强网络的感知能力和预测准确性。 总结来说,yolov7.yaml文件是用于解析YOLOv7网络模型结构和参数的配置文件。其包含了ELAN1(backbone)和ELAN2(head)等组件结构,通过不同的卷积层和连接层来构建整个网络。通过对配置文件解析,可以搭建出对应的YOLOv7网络模型,用于目标检测任务的训练和推理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【YOLOv7_0.1】网络结构与源码解析](https://blog.csdn.net/weixin_43799388/article/details/126164288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值