Если у вас возникнут проблемы с десериализацией вложенного массива XML, любая помощь будет полезна - PullRequest
0 голосов
/ 30 января 2019

каждый раз, когда я десериализую свой конфигурационный файл, массив бочек равен нулю, я пробовал так много разных комбинаций классов и кода, и, похоже, ничего не работает,

Я не могу перечислить все различные классы сериализации иметоды, которые я использовал здесь, так как это заняло бы слишком много страниц, я нахожусь на сборке 33 отладки этой проблемы, чтобы дать вам представление.

XML

<?xml version="1.0" encoding="utf-16"?>
<WeaponEnforcements xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <info>
    <Name>Interior_Pulse_Laser_Base_Large</Name>
    <TName>Turret</TName>
    <AmmoName>Class1LaserBeamCharge</AmmoName>
    <ShotSkip>15</ShotSkip>
    <Range>100</Range>
  </info>
  <barrels>
    <Barrel>
      <BNum>0</BNum>
      <FO>0</FO>
      <BO>0</BO>
      <LO>0</LO>
      <RO>0</RO>
      <LOff>0</LOff>
      <ROff>0</ROff>
      <UOff>0</UOff>
      <DOff>0</DOff>
    </Barrel>
  </barrels>
  <power>
    <defaultScaler>0.005</defaultScaler>
    <idleScaler>0.05</idleScaler>
    <power>5000</power>
  </power>
  <heat>
    <RHT>15740</RHT>
    <HT>450</HT>
    <HIPT>10</HIPT>
    <RHIPT>10</RHIPT>
    <HDPT>30</HDPT>
    <RHDPT>80</RHDPT>
    <RHID>1</RHID>
    <RHDD>300</RHDD>
    <HDD>30</HDD>
    <HID>0</HID>
    <KAC>10</KAC>
  </heat>
  <damage>
    <DamageScaler>0</DamageScaler>
    <SplashRadius>0</SplashRadius>
    <SplashDamage>false</SplashDamage>
  </damage>
  <Version>55</Version>
  <SenderId>0</SenderId>
</WeaponEnforcements>

Класс сериализации

namespace GCFEnergyWeaponsPlugin.Serialization
{
    using System.Collections.Generic;
    using System.Xml.Serialization;

    [System.Serializable()]
    public partial class WeaponEnforcements
    {
        public Info info { get; set; }
        public List<Barrel> barrels = new List<Barrel>();
        public Power power { get; set; }
        public Heat heat { get; set; }
        public Damage damage { get; set; }
        public int Version { get; set; }
        public int SenderId { get; set; }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    public partial class Info
    {
        public string Name { get; set; }
        public string TName { get; set; }
        public string AmmoName { get; set; }
        public int ShotSkip { get; set; }
        public int Range { get; set; }
    }

    [System.SerializableAttribute()]
    public partial class Barrel
    {
        public int BNum { get; set; }
        public double FO { get; set; }
        public double BO { get; set; }
        public double LO { get; set; }
        public double RO { get; set; }
        public float LOff { get; set; }
        public float ROff { get; set; }
        public float UOff { get; set; }
        public float DOff { get; set; }
    }

    [System.SerializableAttribute()]
    public partial class Power
    {
        public double defaultScaler { get; set; }
        public double idleScaler { get; set; }
        public int power { get; set; }
    }

    [System.SerializableAttribute()]
    public partial class Heat
    {
        public int RHT { get; set; }
        public int HT { get; set; }
        public int HIPT { get; set; }
        public int RHIPT { get; set; }
        public double HDPT { get; set; }
        public double RHDPT { get; set; }
        public int RHID { get; set; }
        public int RHDD { get; set; }
        public int HDD { get; set; }
        public int HID { get; set; }
        public int KAC { get; set; }
    }

    [System.SerializableAttribute()]
    public partial class Damage
    {
        public int DamageScaler { get; set; }
        public int SplashRadius { get; set; }
        public string SplashDamage { get; set; }
    }
}

Другая информация

storagelocation_string = Path.Combine(folder, selected_type.ToString() + ".cfg");

StringReader xml_config = new StringReader(File.ReadAllText(storagelocation_string));
WeaponEnforcements ConfigData = (WeaponEnforcements)serializer.Deserialize(xml_config);

Исключительным результатом является массив определений в списке / массиве ( не может использовать сборщик или словарь, так как это для плагина, который работает с другимприложение, которое не принимает эти типы )

Код для чтения массива / списка в список

foreach (var barrel in ConfigData.barrels)
{
    listBox1.Items.Add(barrel.BNum + "," + barrel.FO + "," + barrel.BO + "," + barrel.LO + "," + barrel.RO + "," + barrel.LOff + "," + barrel.ROff + "," + barrel.UOff + "," + barrel.DOff);
}

Имейте в виду, что остальные данные в конфигурации десериализуются правильно, этотолько с бочками, с которыми у меня проблемы.

1 Ответ

0 голосов
/ 31 января 2019

Попробуйте использовать атрибуты XML, доступные в C #

. Для массивов XML используйте [XmlArray], а для элемента используется [XmlArrayItem], это

[XmlArray("barrels")]
[XmlArrayItem("Barrel")]
public List<Barrel> barrels{get;set;}

. Вы также можетепроверьте документацию Microsoft , которая ссылается на вышеуказанное

...