2016-07-14 7 views
0

私はSharpYamlのカスタムパーサーの例を探していましたが、私はシリアライズで解決策を見つけました。 しかし、クラスをカスタム方法で解析する必要があります。SharpYamlカスタム解析

これは私が

public class CommunicationMessage { 

    public string Key { get; set; } 

    public string Value { get; set; } 

    public List<CommunicationMessage> Childs { get; set; } 
} 

を解析するために、これは出力例であるべき必要があるクラスです。そうでない場合は、

employee: 
    - name: Martin 
    - job: Developer 
    - skill: Elite 
    - languages: 
     - c# 
     - java 
     - php 

リスト自体が空であるか、またはNULL値が書き込まれる場合リストを解析する必要があります。 これは私の質問を理解するのに役立ちます。

ありがとうございました!

+0

これは何ですか*カスタムウェイ*とは何を試しましたか? – lokusking

+0

私はいくつかの例を見つけようとしましたが、何も見つかりませんでした。カスタムの方法は、クラスにList ** Childs **が含まれていて、別のキーにシリアライズする必要があるということです。私はJson.Netで同じことをしましたが、SharpYamlで同じことをする方法を見つけることができません –

+0

[YamlRemapAttribute](https://github.com/xoofx/SharpYaml/blob/master/SharpYaml/Serialization /YamlRemapAttribute.cs)。これはあなたのニーズに合うようです – lokusking

答えて

0

物事のカップル:

あなたの例の出力は、マッピングのリストがあることを示唆しています。これはおそらく次のようになります。

employee: 
    name: Martin 
    job: Developer 
    skill: Elite 
    languages: 
    - c# 
    - java 
    - php 

私が質問を理解する限り、CommunicationMessageをシリアル化する必要があります。 各CommunicationMessageオブジェクトは、スカラー(文字列)またはマッピングのリストの2つの異なる種類の値を持つキーと値のマッピングを表します。

このメモリ内構造がyaml配列をどのように表しているか分かりません。あなたが見るように、リスト "Childs"の各エントリはCommunicationMessageなのでKeyを持っていますが、出力例は "languages"の下の配列を示しています。

アレイ内と辞書のような値を使用してメモリ内の表現を修正すると、メモリモデルをループしてエミッタを使用してデータをシリアル化できます。

多くにSharpYamlはYAMLストリームと呼ばれるものをサポートするために見えるが、それは、JSONのために行われるだろうかと同じように動作する、と私はそれらが何であるかを知らない:

EDIT:サンプルコードの下にありませんうまくいかない。適切な場所に右ParsingEventを使用していません。私はこのビットを理解することはできません。

public class EmitterStuff 
{ 
    public static void Main(string[] args) 
    { 
     Dictionary<string, object> toSerialize = new Dictionary<string, object>(); 
     // Add values 


     // Use following code as an example to serialize the in-memory data 
     string yaml; 
     using (TextWriter output = new StringWriter()) 
     { 
      IEmitter emitter = new Emitter(output); 
      emitter.Emit(new DocumentStart()); 
      WriteYamlObject(emitter, toSerialize); 
      emitter.Emit(new DocumentEnd(false)); 
      yaml = output.ToString(); 
     } 

     // result is in yaml 
    } 

    private static void WriteYamlObject(IEmitter emitter, object obj) 
    { 
     if (obj is IDictionary<string, object>) 
     { 
      emitter.Emit(new MappingStart()); 

      var dict = (IDictionary<string, object>) obj; 
      foreach (KeyValuePair<string, object> pair in dict) 
      { 
       emitter.Emit(new Scalar(pair.Key)); 
       WriteYamlObject(emitter, pair.Value); 
      } 

      emitter.Emit(new MappingEnd()); 
     } 
     else if (obj is ICollection<object>) 
     { 
      emitter.Emit(new SequenceStart()); 

      var coll = (ICollection<object>) obj; 
      foreach (object value in coll) 
      { 
       WriteYamlObject(emitter, value); 
      } 

      emitter.Emit(new SequenceEnd()); 
     } 
     else 
     { 
      // You probably should have some special cases here. 
      emitter.Emit(new Scalar(obj.ToString())); 
     } 
    } 
} 
関連する問題