C#-一个类的数组,该数组包含另一个类中的数组,在XML中可读/写

本文关键字:数组 XML 另一个 C#- 包含 一个 | 更新日期: 2023-09-27 18:28:34

我的主要目标是创建一个带有变量的类(让我们称之为test1),其中一个变量是数组。另一个类(我们称之为test2)将包含其他变量,其中一些是test1类的数组。

数组的大小是可变的,并不是完全固定的。我希望能够在运行时增加/减少它们的大小。我还希望它对文件(如XML)是可写和可读的。所以,根据我的理解,它必须能够被"序列化"。

它看起来像这样吗?

public class test1
{
    public String test1_name;
    public String test1_id;
    public Single test1_value;
    public String[] test1_list;
}
public class test2
{
    public test1[] test2_list1;
    public test1[] test2_list2;
    public String[] test2_list;
}

我已经设法弄清楚了如何使用XML序列化来编写文件,例如:

System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(test_a)); //test_a being a simple class holding a simple variable
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//tester.txt";
System.IO.FileStream file = System.IO.File.Create(path);
writer.Serialize(file, tester);
file.Close();

我想确保我可以写入和读取这些数据(可以是XML或二进制,我稍后会决定),并在运行时对其进行修改,同时可以调整数组大小。

我是不是搞错了?我将如何构建它并使其可用、可保存/可读?

有人能帮助我走上正轨,实现我想要实现的目标吗?我知道这可能是一个很大的要求,但如果有一些例子,我们将不胜感激。

C#-一个类的数组,该数组包含另一个类中的数组,在XML中可读/写

你似乎做得很好。你的代码已经工作了。

我创建这个数据是为了测试它。

var tester = new test2()
{
    test2_list1 = new[]
    {
        new test1()
        {
            test1_name = "11",
            test1_id = "12",
            test1_value = 3.1f,
            test1_list = new string[] { "14", "15", "16", },
        },
        new test1()
        {
            test1_name = "21",
            test1_id = "22",
            test1_value = 3.2f,
            test1_list = new string[] { "24", "25", "26", },
        },
    },
    test2_list2 = new[]
    {
        new test1()
        {
            test1_name = "31",
            test1_id = "32",
            test1_value = 3.3f,
            test1_list = new string[] { "34", "35", "36", },
        },
        new test1()
        {
            test1_name = "41",
            test1_id = "42",
            test1_value = 3.4f,
            test1_list = new string[] { "44", "45", "46", },
        },
    },
    test2_list = new string[] { "X", "Y", "Z", },
};

我使用以下代码对其进行了序列化:

System.Xml.Serialization.XmlSerializer serializer
    = new System.Xml.Serialization.XmlSerializer(typeof(test2));
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//tester.txt";
using (System.IO.FileStream file = System.IO.File.Create(path))
{
    serializer.Serialize(file, tester);
    file.Flush();
}

我得到了这个XML:

<?xml version="1.0"?>
<test2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <test2_list1>
    <test1>
      <test1_name>11</test1_name>
      <test1_id>12</test1_id>
      <test1_value>3.1</test1_value>
      <test1_list>
        <string>14</string>
        <string>15</string>
        <string>16</string>
      </test1_list>
    </test1>
    <test1>
      <test1_name>21</test1_name>
      <test1_id>22</test1_id>
      <test1_value>3.2</test1_value>
      <test1_list>
        <string>24</string>
        <string>25</string>
        <string>26</string>
      </test1_list>
    </test1>
  </test2_list1>
  <test2_list2>
    <test1>
      <test1_name>31</test1_name>
      <test1_id>32</test1_id>
      <test1_value>3.3</test1_value>
      <test1_list>
        <string>34</string>
        <string>35</string>
        <string>36</string>
      </test1_list>
    </test1>
    <test1>
      <test1_name>41</test1_name>
      <test1_id>42</test1_id>
      <test1_value>3.4</test1_value>
      <test1_list>
        <string>44</string>
        <string>45</string>
        <string>46</string>
      </test1_list>
    </test1>
  </test2_list2>
  <test2_list>
    <string>X</string>
    <string>Y</string>
    <string>Z</string>
  </test2_list>
</test2>

我能够使用以下代码进行反序列化:

using (System.IO.FileStream file = System.IO.File.OpenRead(path))
{
    test2 x = (test2)serializer.Deserialize(file);
}