C# 将具有多个不带根元素名称的类型的列表序列化为XML

C# 将具有多个不带根元素名称的类型的列表序列化为XML,c#,xml,serialization,C#,Xml,Serialization,我正在尝试序列化下面的对象,但如果没有列表的根名称,则无法序列化它。集线器、交换机和设备是从AbstractNode派生的类型 [XmlRoot(ElementName = "Roothub")] public class RootHub { [XmlArrayItem(typeof(Hub), ElementName = "Hub20")] [XmlArrayItem(typeof(Switch), ElementName = "Switch")] [XmlArrayI

我正在尝试序列化下面的对象,但如果没有列表的根名称,则无法序列化它。集线器、交换机和设备是从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; }
}
[XmlRoot(ElementName=“Roothub”)]
公共类根中心
{
[XmlArrayItem(typeof(Hub),ElementName=“Hub20”)]
[XmlArrayItem(typeof(Switch),ElementName=“Switch”)]
[XmlArrayItem(typeof(Device),ElementName=“Device”)]

公共列表,但它不起作用,因为无法将XmlArrayItem与XmlElement属性混合使用。还有其他方法吗?

使用
XmlElement
属性而不是
XmlArrayItem
,它将为您提供所需的输出

[XmlElement(typeof(Hub), ElementName = "Hub20")]
[XmlElement(typeof(Switch), ElementName = "Switch")]
[XmlElement(typeof(Device), ElementName = "Device")]
public List<AbstractNode> DevicesList { get; set; }
[xmlement(typeof(Hub),ElementName=“Hub20”)]
[xmlement(typeof(Switch),ElementName=“Switch”)]
[xmlement(typeof(Device),ElementName=“Device”)]
公共列表设备列表{get;set;}

设备的数量可以不止一个吗?是的,可以有多个Hub20、交换机、设备。你的DeviceList类是什么样子的?它不是一个类,只是一个抽象节点对象的列表。每个设备都是从该类中派生出来的。对不起,我是说抽象节点类哇,谢谢你。我不相信有这么简单的解决方案。我已经失去了countles现在是时候尝试找到方法了,包括使用IXmlSerializable进行自定义序列化,但没有任何结果…这仍然是一个很好的解决方案,谢谢!
<RootHub>
   <Hub20 Tag="HUB1" VidPid="VID_0000&amp;PID_0000"/>
   <Switch Tag="SWITCH1" />
   <Device Tag="MOUSE" VidPid="VID_0000&amp;PID_0000"/>
</RootHub>
[XmlElement(typeof(Hub), ElementName = "Hub20")]
[XmlElement(typeof(Switch), ElementName = "Switch")]
[XmlElement(typeof(Device), ElementName = "Device")]
public List<AbstractNode> DevicesList { get; set; }