【问题标题】:Serialize into XML a list with multiple types without root element name将具有多种类型且没有根元素名称的列表序列化为 XML
【发布时间】:2015-04-15 17:12:03
【问题描述】:

我正在尝试序列化下面的对象,但如果没有列表的根名称,我将无法对其进行序列化。 Hub、Switch 和 Device 是 AbstractNode 派生的类型。

[XmlRoot(ElementName = "Roothub")]
public class RootHub
{
    [XmlArrayItem(typeof(Hub), ElementName = "Hub20")]
    [XmlArrayItem(typeof(Switch), ElementName = "Switch")]
    [XmlArrayItem(typeof(Device), ElementName = "Device")]
    public List<AbstractNode> DevicesList { get; set; }
}

[XmlInclude(typeof(Hub))]
[XmlInclude(typeof(Device))]
[XmlInclude(typeof(Switch))]

public abstract class AbstractNode
{
    [XmlAttribute]
    public string Tag { get; set; }
}

输出:

<RootHub>
   <DevicesList>
      <Hub20 Tag="HUB1" VidPid="VID_0000&amp;PID_0000"/>
      <Switch Tag="SWITCH1" />
      <Device Tag="MOUSE" VidPid="VID_0000&amp;PID_0000"/>
   </DevicesList>
</RootHub>

但我需要的是这个:

<RootHub>
   <Hub20 Tag="HUB1" VidPid="VID_0000&amp;PID_0000"/>
   <Switch Tag="SWITCH1" />
   <Device Tag="MOUSE" VidPid="VID_0000&amp;PID_0000"/>
</RootHub>

我已经尝试过这个问题Getting rid of an array name in C# XML Serialization 的解决方案,但它不起作用,因为无法将 XmlArrayItem 与 XmlElement 属性混合。还有其他方法吗?

【问题讨论】:

  • 设备数量可以多于一个吗?
  • 是的,可以有多个 Hub20、交换机、设备。
  • 您的 DevicesList 类是什么样的?
  • 它不是一个类,它只是 AbstractNode 对象的列表。每个设备都来自该类。
  • 对不起,我是说 AbstractNode 类

标签: c# xml serialization


【解决方案1】:

使用XmlElement 属性而不是XmlArrayItem,它会给你你想要的输出。

[XmlElement(typeof(Hub), ElementName = "Hub20")]
[XmlElement(typeof(Switch), ElementName = "Switch")]
[XmlElement(typeof(Device), ElementName = "Device")]
public List<AbstractNode> DevicesList { get; set; }

【讨论】:

  • 哇,谢谢。我无法相信如此简单的解决方案。我已经浪费了无数时间试图找到方法,包括使用 IXmlSerializable 进行自定义序列化而没有任何结果......
  • 用class代替List怎么样?喜欢钱价格{get;放;}。 Money 具有金额和货币属性。我们可以这样序列化一个对象吗?它不以相同的方式工作。还有其他建议吗?
  • @ahmet 您的问题似乎与 OP 的问题完全无关。您应该发布一个新问题,而不是评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2017-02-07
相关资源
最近更新 更多