0

大约一个星期以来,我一直在断断续续地挣扎。

我正在创建一个可以采用 .yaml 并将其解析为对象以进行操作和输出的程序。我遇到的问题是 YAMLDotNet 包的错误,当它到达反序列化指令时,它会引发如下异常:

YamlDotNet.dll 中出现“YamlDotNet.Core.YamlException”类型的未处理异常

附加信息:(Line: 5, Col: 13, Idx: 54) - (Line: 5, Col: 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));*/
4

1 回答 1

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);
于 2017-08-26T11:15:59.763 回答