Десериализация файла 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));*/

1 ответ

Ваши типы не соответствуют 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);
Другие вопросы по тегам