在YamlDotNet中:有没有办法在序列中输出空值作为空字符串?

时间:2017-10-24 14:14:43

标签: yamldotnet

在IYamlTypeConverter中编写序列时,您可能会使用以下代码:

public class MyObjectConverter : IYamlTypeConverter {
    public MyObjectConverter() {}

    public bool Accepts(Type type) { return typeof(IMyObject) == type || typeof(IMyObject[]) == type; }
    public object ReadYaml(IParser parser, Type type) { return null; }
    public void WriteYaml(IEmitter emitter, object value, Type type) {
        var itemVal = value as IMyObject;
        if (itemVal != null)
            emitter.Emit(new Scalar(itemVal.GetID()));
        else {
            var arrayVal = value as IMyObject[];
            emitter.Emit(new SequenceStart(null, null, true, SequenceStyle.Block));
            if (arrayVal != null) {
                foreach (var item in arrayVal)
                    if (item != null) emitter.Emit(new Scalar(item.GetID()));
                    else              emitter.Emit(new Scalar("null"));
            }
            emitter.Emit(new SequenceEnd());
        }
    }
}

通过致电emitter.Emit(new Scalar("null")),您将得到一个“空白”。序列中的条目,但如果您将序列化保留到YamlDotNet,它将被序列化为'' (空字符串)。

在编写自定义IYamlTypeConverter时,如何在序列中输出空值作为空字符串?

2 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是创建一个将添加此逻辑的自定义IEventEmitter

public class NullStringsAsEmptyEventEmitter : ChainedEventEmitter
{
    public NullStringsAsEmptyEventEmitter(IEventEmitter nextEmitter)
        : base(nextEmitter)
    {
    }

    public override void Emit(ScalarEventInfo eventInfo, IEmitter emitter)
    {
        if (eventInfo.Source.Type == typeof(string) && eventInfo.Source.Value == null)
        {
            emitter.Emit(new Scalar(string.Empty));
        }
        else
        {
            base.Emit(eventInfo, emitter);
        }
    }
}

然后你就这样注册:

var serializer = new SerializerBuilder()
    .WithEventEmitter(nextEmitter => new NullStringsAsEmptyEventEmitter(nextEmitter))
    .Build();

Here's a fiddle with this code

答案 1 :(得分:0)

根据http://www.yaml.org/refcard.html

,您似乎可以使用'〜'表示空值