2016-07-14 7 views
0

Ich suchte nach einem benutzerdefinierten Parser Beispiel für SharpYaml, aber ich fand nur Lösungen über Serialisierung. Aber ich muss eine Klasse den benutzerdefinierten Weg analysieren.SharpYaml benutzerdefinierte Parsing

Dies ist die Klasse i

public class CommunicationMessage { 

    public string Key { get; set; } 

    public string Value { get; set; } 

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

Und dies sollte ein Beispiel für die Ausgabe analysieren müssen:

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

Wenn die Liste selbst ist leer oder null der Wert geschrieben werden sollte, da sonst die Liste sollte analysiert werden. Hoffe, dass dies hilft, meine Frage zu verstehen

Vielen Dank für Ihre Hilfe!

+0

Was ist das * Custom Way * und was hast du schon probiert? – lokusking

+0

Ich habe versucht, einige Beispiele zu finden, aber nichts gefunden. Der benutzerdefinierte Weg besteht darin, dass die Klasse eine Liste ** Childs ** enthält, die zu einem anderen Schlüssel serialisiert werden sollte. Ich habe das gleiche mit Json.Net gemacht, aber ich kann keinen Weg finden, das gleiche mit SharpYaml zu tun. –

+0

Werfen Sie einen Blick auf [YamlRemapAttribute] (https://github.com/xoofx/SharpYaml/blob/master/SharpYaml/Serialization /YamlRemapAttribute.cs). Dies scheint Ihre Bedürfnisse zu erfüllen – lokusking

Antwort

0

Paar Dinge:

Ihr Beispiel Ausgang legt nahe, dass es eine Liste der Zuordnungen ist. Es sollte wahrscheinlich so aussehen:

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

Soweit ich die Frage verstehe, möchten Sie CommunicationMessage serialisieren. Jedes CommunicationMessage-Objekt stellt eine Schlüssel-Wert-Zuordnung dar, die zwei verschiedene Arten von Werten aufweisen kann: Ein Skalar (Zeichenfolge) oder eine Liste von Zuordnungen.

Was ich nicht verstehe, ist, wie diese In-Memory-Struktur ein YAML-Array darstellen würde. Sie sehen, jeder Eintrag in der Liste "Childs" ist eine CommunicationMessage, also hat er einen Schlüssel, während die Beispielausgabe ein Array unter "Sprachen" zeigt, das keine Schlüssel, nur Werte hat.

Sobald Sie die In-Memory-Darstellung beheben (Array- und Dictionary-ähnliche Werte zulassen), können Sie das Speichermodell durchlaufen und zum Serialisieren der Daten einen Emitter verwenden.

, dass viele die gleiche Art und Weise funktioniert, wie man es für json getan werden würde, obwohl SharpYaml etwas yaml Ströme genannt zu unterstützen scheint, und ich weiß nicht, was diese sind:

EDIT: Untercodebeispiel tut nicht arbeiten. Es verwendet nicht das richtige ParsingEvent s an den richtigen Stellen. Ich kann mir das nicht vorstellen.

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