2017-10-24 2 views
1

あなたはこのようにいくつかのコードを使用することがありますIYamlTypeConverter順序を書く:それは、あなたが順番に「NULL」のエントリになるだろうemitter.Emit(new Scalar("null"))を呼び出すことによりYamlDotNet:シーケンス内に空の文字列としてnull値を出力する方法はありますか?

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()); 
     } 
    } 
} 

が、あなたはYamlDotNetまでの連載を残す場合''(空の文字列)としてシリアライズされます。

カスタムIYamlTypeConverterを書き込むときに、空の文字列としてシーケンスにnull値を出力するにはどうすればよいですか?

答えて

1

に応じてこれを達成する1つの方法は、このロジックを追加するカスタムIEventEmitterを作成することで、あなたは、単に「〜」でNULL値を表すことができそうです:

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

+0

うーん..私はこの答えをあまりにも早く受け入れたようだ。 私はまだYamlDotNet.Core.Emitter.AnalyzeScalarでnull参照を取得しています。 また、私はフィドルリンクがあなたが表示しようとしたコードにつながっていないと思います。 – Steinbitglis

+0

私はフィドルのコードを更新しました。私は救うことを忘れていたに違いない。スタックトレースにNullReferenceExceptionを指定できますか? –

関連する問題