反序列化元素的XML数组

bl4*_*h4k 5 c#

所以,反序列化正在工作,但是我有一些这样的xml:

<File>
  <Stuff>stuff</Stuff>
  <Devices>
    <Device Type="1">
      <Number>1</Number>
    </Device>
    <Device Type="2">
      <Number>2</Number>
    </Device>
  </Devices>
</File>
Run Code Online (Sandbox Code Playgroud)

当到达设备阵列时...第一个设备是唯一填充到对象中的设备。这些是类:

            XmlSerializer deserializer;
            XmlRootAttribute xRoot = new XmlRootAttribute();
            FileStream stream = new FileStream(CONFIG_PATH, FileMode.Open);
            XmlReader reader = new XmlTextReader(stream);

            // Details configuration area.
            xRoot.ElementName = "File";
            xRoot.IsNullable = true;
            deserializer = new XmlSerializer(typeof(File), xRoot);
            Configuration = (File)deserializer.Deserialize(reader);

[Serializable()]
[XmlRoot(ElementName = "File", IsNullable = true)]
public sealed class File
{
    [XmlElement("Devices")]
    public Devices Devices { get; set; }
}

// <summary>
/// Configuration device elements.
/// </summary>
[Serializable()]
[XmlRoot("Devices", IsNullable = true)]
public sealed class Devices
{
    [XmlElement("Device")]
    public DeviceElements[] DeviceElements { get; set; }
}

/// <summary>
/// Configuration Devices.
/// </summary>
[Serializable()]
[XmlRoot("Device", IsNullable = true)]
public sealed class DeviceElements
{
    [XmlAttribute("Type")]
    public string DeviceType { get; set; }

    [XmlElement("Number")]
    public int DeviceNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

同样,只有第一个设备被填充,我玩过XmlArray和XmlArrayItem,但是它们都没有给我第一个值。有什么建议么?

Bro*_*ass 5

您必须在另一个地方做错了。仅使用DevicesXML 的一部分:

  <Devices>
    <Device Type="1">
      <Number>1</Number>
    </Device>
    <Device Type="2">
      <Number>2</Number>
    </Device>
  </Devices>
Run Code Online (Sandbox Code Playgroud)

对于上面给出的类,我能够使用与上一个问题中使用的相似的代码成功地反序列化Devices具有多个DeviceElements子级的类实例。

FileStream stream = new FileStream("test.xml", FileMode.Open);
XmlReader reader = new XmlTextReader(stream);

XmlSerializer deserializer = new XmlSerializer(typeof(Devices));
var devicesResult = (Devices)deserializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)

编辑:

使用完整的XML:

<File>
  <Stuff>stuff</Stuff>
  <Devices>
    <Device Type="1">
      <Number>1</Number>
    </Device>
    <Device Type="2">
      <Number>2</Number>
    </Device>
  </Devices>
</File>
Run Code Online (Sandbox Code Playgroud)

这成功地反序列化了我:

FileStream stream = new FileStream("test.xml", FileMode.Open);
XmlReader reader = new XmlTextReader(stream);

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "File";
xRoot.IsNullable = true;

XmlSerializer deserializer = new XmlSerializer(typeof(File), xRoot);
var fileResult = (File)deserializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)

附带说明一下-您可能不应该将您的类命名为与.NET Framework(System.IO.File)中相同的名称,同样在上述代码示例中,也不需要设置Xml根目录,因为无论如何您都使用相同的名称,只需将其省略:

FileStream stream = new FileStream("test.xml", FileMode.Open);
XmlReader reader = new XmlTextReader(stream);
XmlSerializer deserializer = new XmlSerializer(typeof(File));
var fileResult = (File)deserializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)