2017-08-26 63 views
0

我一直在爲一週左右的事情掙扎大約一週。反序列化一個YAML文件 - 基於夏娃在線

我正在創建一個程序,可以將.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

你的類型不與您在示例中顯示的Yaml相匹配。

要正確地反序列化它,你只需要創建一個類:

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