首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将YamlDotNet ScalarStyle.SingleQuoted应用于List<string>中的string属性?

如何将YamlDotNet ScalarStyle.SingleQuoted应用于List<string>中的string属性?
EN

Stack Overflow用户
提问于 2021-12-01 18:02:30
回答 1查看 114关注 0票数 1

我正在使用YamlDotNet来序列化这样的对象

代码语言:javascript
复制
using System.Collections.Generic;
using YamlDotNet.Core;
using YamlDotNet.Serialization;

public class Thing
{
    [YamlMember(ScalarStyle = ScalarStyle.SingleQuoted)]
    public string Name

    [YamlMember(ScalarStyle = ScalarStyle.SingleQuoted)]
    public List<string> Attributes
}

正如预期的那样,我成功地序列化了普通字符串属性

代码语言:javascript
复制
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

var myObject = new Thing
{
    Name = "foo"
    Attributes = new List<string>() { "bar" }
};

var ymlSerializer = new SerializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitEmptyCollections | DefaultValuesHandling.OmitNull)
    .Build();

var serializedYaml = ymlSerializer.Serialize(myObject);

生成yaml:

代码语言:javascript
复制
name: 'foo'
attributes:
- bar

预期yaml:

代码语言:javascript
复制
name: 'foo'
attributes:
- 'bar'

如何将标量样式属性应用于基元列表?

EN

回答 1

Stack Overflow用户

发布于 2021-12-01 22:09:48

你必须使用一个自定义的转换器:

自定义类转换器:

代码语言:javascript
复制
    public class ThingCategoryYamlTypeConverter : IYamlTypeConverter
    {
        private void WriteContentCategory(IEmitter emitter, object value)
        {
            Thing node;
            node = (Thing)value;

            emitter.Emit(new MappingStart(null, null, false, MappingStyle.Block));

            if (node.Name != null)
            {
                emitter.Emit(new Scalar(null, "name"));
                emitter.Emit(new Scalar(null, null, node.Name, ScalarStyle.SingleQuoted, true, false));
            }

            if (node.Attributes != null)
            {
                this.WriteAttributes(emitter, node);
            }

            emitter.Emit(new MappingEnd());
        }

        private void WriteAttributes(IEmitter emitter, Thing node)
        {
            emitter.Emit(new Scalar(null, "attributes"));
            emitter.Emit(new SequenceStart(null, null, false, SequenceStyle.Block));

            foreach (string child in node.Attributes)
            {
                emitter.Emit(new Scalar(null, null, child, ScalarStyle.SingleQuoted, true, false ));
            }

            emitter.Emit(new SequenceEnd());
        }

        public bool Accepts(Type type)
        {
            return type == typeof(Thing);
        }

        public object ReadYaml(IParser parser, Type type)
        {
            // use for deserialization
            throw new NotImplementedException();
        }

        public void WriteYaml(IEmitter emitter, object value, Type type)
        {
            this.WriteContentCategory(emitter, value);
        }
    }

你的班级:

代码语言:javascript
复制
    public class Thing
    {
        public string Name;

        public List<string> Attributes;
    }

调用自定义转换器

代码语言:javascript
复制
    static void Main(string[] args)
    {
        var myObject = new Thing
        {
            Name = "foo",
            Attributes = new List<string> { "bar" }
        };

        var ymlSerializer = new SerializerBuilder()
            .WithTypeConverter(new ThingCategoryYamlTypeConverter())
            .ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitEmptyCollections | DefaultValuesHandling.OmitNull)
            .Build();

        var serializedYaml = ymlSerializer.Serialize(myObject);

    }

结果:

代码语言:javascript
复制
name: 'foo'
attributes:
- 'bar'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70189169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档