You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用YamlDotNet将对象列表序列化为带自定义名称的对象

问题

我希望将对象列表序列化为对象而非列表结构,对象的名称取自列表中对象自身的Name属性。目前我已实现该需求,但需要手动遍历对象的所有属性,因此想了解YamlDotNet是否提供了内置方法来完成此操作?

我的代码结构如下:

public class Config
{
   public List<Component> Components { get; set; }
}

public class Component
{
   public string Name { get; set; }
   public string OtherProperties { get; set; }
}

期望生成的YAML输出格式如下:

Components:
  nameFromObjectProperty:
    OtherProperties: ""
  nameOfOtherComponent:
    OtherProperties: ""
解决方案

YamlDotNet没有直接的内置开关实现这个需求,但可以通过**自定义类型转换器(IYamlTypeConverter)**优雅处理,不用手动遍历所有属性。

实现步骤:

  1. 创建针对List<Component>的类型转换器,将列表转换为以Name为键、排除Name属性的组件对象为值的字典。
  2. 将转换器注册到Yaml序列化器配置中。

示例代码:

using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;

public class ComponentListConverter : IYamlTypeConverter
{
    public bool Accepts(Type type)
    {
        return type == typeof(List<Component>);
    }

    public object ReadYaml(IParser parser, Type type)
    {
        // 如需支持反序列化,可完善此逻辑,将字典转回列表
        var dict = new DeserializerBuilder().Build().Deserialize<Dictionary<string, Component>>(parser);
        return dict.Values.ToList();
    }

    public void WriteYaml(IEmitter emitter, object value, Type type)
    {
        var components = (List<Component>)value;
        var componentDict = components.ToDictionary(c => c.Name, c => new { c.OtherProperties });

        // 复用YamlDotNet内置的字典序列化逻辑,无需手动处理属性
        var serializer = new SerializerBuilder().Build();
        serializer.Serialize(emitter, componentDict);
    }
}

配置并使用序列化器:

var config = new Config
{
    Components = new List<Component>
    {
        new Component { Name = "nameFromObjectProperty", OtherProperties = "value1" },
        new Component { Name = "nameOfOtherComponent", OtherProperties = "value2" }
    }
};

var yaml = new SerializerBuilder()
    .WithTypeConverter(new ComponentListConverter())
    .Build()
    .Serialize(config);

Console.WriteLine(yaml);

说明:

  • WriteYaml方法将列表转成字典后,直接借助YamlDotNet自带的序列化逻辑处理字典,避免手动遍历属性的冗余操作。
  • 如果需要支持反序列化,补全ReadYaml方法即可实现字典到列表的转换。

内容的提问来源于stack exchange,提问作者MartinDotNet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:54:50