2017-08-26 10 views
0

Ich habe seit ungefähr einer Woche mit etwas an und ab gekämpft.Deserialisieren einer YAML-Datei - Eve Online basierte

Ich erstelle ein Programm, das eine .yaml aufnehmen und in ein Objekt für Manipulation und Ausgabe analysieren kann. Das Problem ich habe, ist ein Fehler bei dem YAMLDotNet Paket, wenn es um die Deserialisierung Anweisung erhält wirft es eine Ausnahme, wie folgt:

Eine nicht behandelte Ausnahme des Typs ‚YamlDotNet.Core.YamlException‘ in YamlDotNet.dll aufgetreten

Zusätzliche Informationen: (Line: 5, Col: 13, Idx: 54) - (Line: 5, Col: 22, Idx: 63): Ausnahme bei der Deserialisierung

ich es erkennen, mit dem Charakter verbunden ist, zB " "Und ich glaube, es ist ein Problem, keine Typen zuzuweisen. Ich habe mich umgesehen und ein paar Lösungen ausprobiert, wie Sie mit einigen kommentierten Code sehen werden, aber kein Glück. Kann mir bitte jemand in die richtige Richtung zeigen? Ich würde auch alle relevanten Lektüre über Serialisierung und Deserialisierung um YAML schätzen.

Disclaimer: Ich bin ein halbgebildeter, nicht veröffentlichter Coder, der nur für meine eigenen Zwecke kodiert. Dies ist mein erster Versuch, öffentliche Hilfe zu einem Codeproblem zu bekommen. Wenn ich nicht genügend Informationen oder falsche Informationen angegeben habe, lass es mich wissen, damit ich es korrigieren kann. Hier

ist eine Probe des YAML:

0: 
    groupID: 0 
    mass: 1.0 
    name: 
     de: '#System' 
     en: '#System' 
     fr: '#Système' 
     ja: '#システム' 
     ru: '#Система' 
     zh: '#星系' 
    portionSize: 1 
    published: false 
2: 
    groupID: 2 
    name: 
     de: Corporation 
     en: Corporation 
     fr: Corporation 
     ja: コーポレーション 
     ru: Corporation 
     zh: 军团 
    portionSize: 1 
    published: false 
3: 
    groupID: 3 
    name: 
     de: Region 
     en: Region 
     fr: Région 
     ja: リージョン 
     ru: Region 
     zh: 星域 
    portionSize: 1 
    published: false 
    volume: 1.0 
4: 
    groupID: 4 
    name: 
     de: Constellation 
     en: Constellation 
     fr: Constellation 
     ja: コンステレーション 
     ru: Constellation 
     zh: 星座 
    portionSize: 1 
    published: false 
    volume: 1.0 
5: 
    groupID: 5 
    name: 
     de: Solar System 
     en: Solar System 
     fr: Système solaire 
     ja: ソーラーシステム 
     ru: Solar System 
     zh: 星系 
    portionSize: 1 
    published: false 
    radius: 5000000000000.0 
    volume: 1.0 
6: 
    description: 
     de: 'Dieser Hauptreihenstern gehört einer Klasse an, die sich oft durch eine 
      gelbe oder gelblich-orange Farbe auszeichnet und über den gewaltigen Wasserstofffusionsprozess 
      im Herzen des Sterns eine enorme Menge Energie erzeugt und ausstrahlt. 




      Im Orbit dieser Planeten können sowohl terrestrische Planeten als auch 
      Gasriesen in unterschiedlicher Anzahl gefunden werden, von denen sich 
      einer oder mehrere in der bewohnbaren Zone befindet.' 
     en: "A main-sequence stellar body of a class that is often yellow or yellow-orange 
      in hue, generating and emitting energy from the vast hydrogen fusion process 
      within the heart of the star.\r\n\r\nVarious numbers of planets of the 
      terrestrial and gas giant types are found around these stars and the habitable 
      zones often contain one or more planets." 
     fr: Communément jaunes ou jaune orangé, ces étoiles de la séquence principale 
      génèrent et émettent de l'énergie par fusion des noyaux d'hydrogène emprisonnés 
      dans le cœur. Leur écosphère stellaire engendre la formation de planètes 
      géantes de type terrestre ou gazeux, parmi lesquelles quelques spécimens 
      gravitent souvent en zone habitable. 
     ru: 'Звезда главной последовательности, желтого или желто-оранжевого цвета, 
      генерирует и излучает энергию в ходе мощного процесса водородного термоядерного 
      синтеза, идущего в центре звезды. 




      Вокруг этих звезд могут находиться планетные системы, состоящие из планет 
      земного типа и газовых гигантов; в обитаемой зоне часто находится как 
      минимум одна планета.' 
    graphicID: 21457 
    groupID: 6 
    mass: 1000000000000000000 

Hier sind meine Objektklassen:

class YAMLTypeIDs 
{ 
    public Dictionary<int,YAMLtempItem> YAMLTypeids { get; set; } 
} 
class YAMLtempItem 
{ 
    public decimal basePrice { get; set; } 
    public Dictionary<string, YAMLItemDescription> description { set; get; } 
    public int groupID { get; set; } 
    public int iconID { get; set; } 
    public int marketGroupID{ get; set; } 
    public string mass { get; set; } 
    public Dictionary<string, YAMLItemName> name { set; get; } 
    public int portionSize { get; set; } 
    public bool published { get; set; } 
    public decimal volume { get; set; } 
} 
class YAMLItemDescription 
{ 
    public string de { get; set; } 
    public string en { get; set; } 
    public string fr { get; set; } 
    public string ja { get; set; } 
    public string ru { get; set; } 
    public string zh { get; set; } 
} 
class YAMLItemName 
{ 
    public string de { get; set; } 
    public string en { get; set; } 
    public string fr { get; set; } 
    public string ja { get; set; } 
    public string ru { get; set; } 
    public string zh { get; set; } 
} 

und hier ist meine Befehlscode:

input = System.IO.File.ReadAllText(@"sde/fsd/typeIDs.yaml"); 
var deserializer = new Deserializer(); 
var strtemp = new StringReader(input); 
var itemTypes = deserializer.Deserialize<Dictionary<int, YAMLtempItem>>(strtemp); 
      /*deserializer.RegisterTagMapping("de", typeof(string)); 
      deserializer.RegisterTagMapping("en", typeof(string)); 
      deserializer.RegisterTagMapping("fr", typeof(string)); 
      deserializer.RegisterTagMapping("ja", typeof(string)); 
      deserializer.RegisterTagMapping("ru", typeof(string)); 
      deserializer.RegisterTagMapping("zh", typeof(string)); 
      deserializer.RegisterTagMapping("name", typeof(YAMLItemName)); 
      deserializer.RegisterTagMapping("groupID", typeof(int)); 
      deserializer.RegisterTagMapping("portionSize", typeof(int)); 
      deserializer.RegisterTagMapping("published", typeof(bool)); 
      deserializer.RegisterTagMapping("volume", typeof(decimal)); 
      deserializer.RegisterTagMapping("description", typeof(YAMLItemDescription)); 
      deserializer.RegisterTagMapping("graphicID", typeof(int)); 
      deserializer.RegisterTagMapping("mass", typeof(string));*/ 

Antwort

0

Ihre Typen nicht Finde die Yaml, die du in deinem Beispiel gezeigt hast.

Um es richtig deserialisieren Sie brauchen nur eine einzige Klasse zu erstellen:

class YAMLtempItem 
{ 
    public decimal? basePrice { get; set; } 
    public Dictionary<string, string> description { set; get; } 
    public int groupID { get; set; } 
    public int? iconID { get; set; } 
    public int? marketGroupID{ get; set; } 
    public string mass { get; set; } 
    public Dictionary<string, string> name { set; get; } 
    public int portionSize { get; set; } 
    public bool published { get; set; } 
    public decimal? volume { get; set; } 
    public double? radius { get; set; } 
    public int? graphicID { get; set; } 
} 

Und deserialisieren Ihre String in einem Wörterbuch (wie Sie bereits getan haben):

var itemTypes = deserializer.Deserialize<Dictionary<int, YAMLtempItem>>(strtemp);