C#将子类存储到XML文件



我想让将大量数据存储到XML文件中。在我使用结构并运行良好之前,但是现在我想使用课程,请参阅下面的示例。保存到XML时,子类未保存到XML。

在XML文件中,我看到了一堆

<logic>
<logicData xsi:nil="true" />
<logicData xsi:nil="true" />
<logicData xsi:nil="true" />

这是我使用的当前代码

  public class colorProfileSettings
{
    public int[] btn_background = new int[16];
    public int[] btn_input = new int[16];
    public int[] btn_press = new int[16];
}
public class logicData
{
    public colorProfileSettings[] colors = new colorProfileSettings[2];
    public int configBtnLedTest = 0;
    public int configBtnDimPlus = 0;
    public int configBtnDimMin = 0;
    public int configBtnCleaning = 0;
    public int configBtnDayNightToggle = 0;
    public int groupBg = 0;
    public int groupLedTest = 0;
    public int groupDimming = 10;
}
public class ClassConfigData
{
    public logicData[] logic = new logicData[100];
    public string fileLocName;
}
public ClassConfigData data = new ClassConfigData();
public void WriteXML(string fileLoc)
{
    try
    {
        if (System.IO.File.Exists(fileLoc))
        {
            XmlSerializer writer = new XmlSerializer(typeof(ClassConfigData));
            StreamWriter file = new StreamWriter(@fileLoc);
            writer.Serialize(file, data);
            file.Close();
        }
        else
        {
            throw new ArgumentNullException("Not a valid file selected.");
        }
    }
    catch (Exception e)
    {
        throw e;
    }
}

问题是您永远不会实例化任何logicData数组元素。

我将您的ClassConfigData类更改为以下内容,将您的logicData类更改为以下内容,并且按预期工作。

public class ClassConfigData
{
    public logicData[] logic = new logicData[100];
    public string fileLocName;
    public ClassConfigData()
    {
        for (int i = 0; i < logic.Length; i++)
        {
            logic[i] = new logicData();
        }
    }
}
public class logicData
{
    public colorProfileSettings[] colors = new colorProfileSettings[2];
    public int configBtnLedTest = 0;
    public int configBtnDimPlus = 0;
    public int configBtnDimMin = 0;
    public int configBtnCleaning = 0;
    public int configBtnDayNightToggle = 0;
    public int groupBg = 0;
    public int groupLedTest = 0;
    public int groupDimming = 10;
    public logicData()
    {
        for (int i = 0; i < colors.Length; i++)
        {
            colors[i] = new colorProfileSettings();
        }
    }
}

然后我运行了WriteXML("test.xml");,它确实做了它应该拥有的。

<?xml version="1.0" encoding="utf-8"?>
<ClassConfigData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <logic>
    <logicData>
      <colors>
        <colorProfileSettings>
          <btn_background>
            <int>0</int>
            ...
          </btn_background>
          ...
        </colorProfileSettings>
        ...
      </colors>
      <configBtnLedTest>0</configBtnLedTest>
      <configBtnDimPlus>0</configBtnDimPlus>
      <configBtnDimMin>0</configBtnDimMin>
      <configBtnCleaning>0</configBtnCleaning>
      <configBtnDayNightToggle>0</configBtnDayNightToggle>
      <groupBg>0</groupBg>
      <groupLedTest>0</groupLedTest>
      <groupDimming>10</groupDimming>
    </logicData>
    <logicData>
      <colors>
        <colorProfileSettings>
          <btn_background>
            <int>0</int>
            ...
          </btn_background>
          ...
        </colorProfileSettings>
        ...
      </colors>
      <configBtnLedTest>0</configBtnLedTest>
      <configBtnDimPlus>0</configBtnDimPlus>
      <configBtnDimMin>0</configBtnDimMin>
      <configBtnCleaning>0</configBtnCleaning>
      <configBtnDayNightToggle>0</configBtnDayNightToggle>
      <groupBg>0</groupBg>
      <groupLedTest>0</groupLedTest>
      <groupDimming>10</groupDimming>
    </logicData>
    ...

另外, anytime 您创建一个参考类型的数组( class),然后您必须 acky 阵列的每个元素。>> 否则,它们都是null,因此,当序列化时,将没有 sub-properties ,因为它们尚不存在!您不必这样做的原因使用structs是因为每次创建structure类型的数组( value types )时,CLR将数组的内存清除到每个元素的struct类型的新实例。这也是为什么在struct中,您必须在structure中创建constructor时为每个属性指定一个值。

以下代码证明了这一事实:

public struct StructureType
{
    public int number;
    public int otherNumber;
}
public class ClassType
{
    public int number;
    public int otherNumber;
}
StructureType[] s1 = new StructureType[2];
s1[0].number = 25;
ClassType[] c1 = new ClassType[2];
c1[0].number = 25;

您将在c1[0].number = 25;行上获得NullReferenceException,因为c1[0] 不存在。 ,但s1[0].number = 25;的工作方式为s1[0]默认为Memory中的所有零。

最新更新