如何用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)**优雅处理,不用手动遍历所有属性。
实现步骤:
- 创建针对
List<Component>的类型转换器,将列表转换为以Name为键、排除Name属性的组件对象为值的字典。 - 将转换器注册到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
相关产品推荐
相关产品推荐

