2017-08-26 7 views
0

私は約1週間オンとオフに何かを苦労しています。YAMLファイルのデシリアライズ - Eve Onlineベース

私は.yamlを取り込み、操作して出力するためのオブジェクトに解析するプログラムを作成しています。私が持っている 問題は、それが逆シリアル化の命令になると、次のように例外をスローする、YAMLDotNetパッケージでエラーです:

タイプの未処理の例外「YamlDotNet.Core.YamlException」はYamlDotNet.dll

で発生しました

追加情報:(ライン:5、コル:13、IDX:54) - (ライン:5、コル:22、IDX:63):例外のデシリアライゼーション

の間に、私はそれが文字に関連付けられている実感 "" "私はそれがタイプを割り当てないという問題だと信じています。私は周りを見て、いくつかのコメントコードではなく運が表示されますようにいくつかのソリューションを試してみました。誰かが私を正しい方向に向けることができますか?また、YAMLのシリアライゼーションとデシリアライゼーションに関する関連資料を高く評価します。

免責事項:私は自分の楽しみ/目的をコーディングするだけの、半教育の公開されていないコーダーです。これは私の最初の試みです。私が十分な情報や間違った情報を提供していない場合は、私がそれを修正できるように私に知らせてください。ここで

は、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 

は私のオブジェクトクラスです:

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

、ここでは私の命令コードです:

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));*/ 

答えて

0

あなたのタイプにはありませんあなたの例の中に示したヤムと一致してください。

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

と辞書(あなたがすでに行っているように)にあなたの文字列をデシリアライズ:

var itemTypes = deserializer.Deserialize<Dictionary<int, YAMLtempItem>>(strtemp); 
正しくあなただけの単一のクラスを作成する必要があり、それをデシリアライズする

関連する問題