在反序列化嵌套的xml数组时遇到麻烦,将不胜感激

时间:2019-01-30 20:54:36

标签: c# .net xml serialization deserialization

每次我反序列化配置文件时,barrels的数组为null,我尝试了太多不同的类和代码组合,但是似乎没有任何作用,

我无法列出我在这里使用过的所有不同的序列化类和方法,因为这会占用太多页面,我正在调试该问题的内部版本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);

例外结果是列表/数组中的定义数组(不能使用collect或dictionary,因为这是用于与其他不接受这些类型的应用程序一起使用的插件

用于将数组/列表读入列表框的代码

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 :(得分:2)

尝试使用C#中可用的XML属性

对于XML数组使用[XmlArray],对于项目使用[XmlArrayItem],此

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

您还可以查看参考上述内容的Microsoft文档