反序列化 XML 元素数组

5
因此,反序列化正在工作,但我有一些像这样的XML:

所以,反序列化是有效的,但我有一些这样的xml:

<File>
  <Stuff>stuff</Stuff>
  <Devices>
    <Device Type="1">
      <Number>1</Number>
    </Device>
    <Device Type="2">
      <Number>2</Number>
    </Device>
  </Devices>
</File>

当涉及到设备数组时...第一个设备是唯一一个被填充到对象中的。以下是类:

            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; }
}

再次强调,只有第一个设备被填充了,我尝试过XmlArray和XmlArrayItem,但它们都没有给出第一个值。 有什么建议吗?


你尝试过去掉所有的“XmlElement”和“XmlRoot”属性吗?我发现当我尽可能地不去干涉,让框架自己处理时,序列化效果最好。 - drharris
如果我把它们拿出来,甚至无法反序列化。 - bl4kh4k
尝试这个建议:https://dev59.com/pkbRa4cB1Zd3GeqP1IQw - Dave Ziegler
每个设备元素必须显式地被称为“Device”。在“Devices”元素内,设备可以是无限数量的元素。上述建议在我的情况下不起作用。 - bl4kh4k
1
祝你好运!希望你能解决它。 - user195488
1个回答

5
你在其他地方可能做错了什么。只需使用你的 XML 中的 Devices 部分即可:
  <Devices>
    <Device Type="1">
      <Number>1</Number>
    </Device>
    <Device Type="2">
      <Number>2</Number>
    </Device>
  </Devices>

使用您上面的类,我可以成功地反序列化具有多个DeviceElements子元素的Devices类实例,使用与您在上个问题中使用的类似代码:

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);

编辑:

使用完整的XML:

<File>
  <Stuff>stuff</Stuff>
  <Devices>
    <Device Type="1">
      <Number>1</Number>
    </Device>
    <Device Type="2">
      <Number>2</Number>
    </Device>
  </Devices>
</File>

这个对我来说成功地反序列化了:

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);

顺便提一下 - 你可能不应该将自己的类命名为已经存在于.NET框架中的类(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);

那么也许我的问题出在更高级别,我将反序列化器 typeof 设置为带有以下内容的 File 类:public sealed class File { [XmlElement("File")] public Devices Devices { get; set; } }这可能是我的问题吗? - bl4kh4k
@bl4kh4k:没有看到能够重现问题的完整代码示例很难说,更新问题会很有帮助。 - BrokenGlass
刚刚更新了缺失的类。如果你能够解决它,那么你就是一个序列化之神。 - bl4kh4k
我移除了XmlRootAttribute,但它仍然只会反序列化数组中的第一个Device。 - bl4kh4k
它可以工作,但是其中一些元素内部的元素没有反序列化,这显然会阻止它添加到数组中并退出。感谢您的帮助。干杯。 - bl4kh4k
@bl4kh4k 是什么类型的元素? - kul_mi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接