序列化为 XML 一个没有根元素名称的具有多种类型的列表
Serialize into XML a list with multiple types without root element name
我正在尝试序列化下面的对象,但没有列表的根名称我无法序列化它。 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&PID_0000"/>
<Switch Tag="SWITCH1" />
<Device Tag="MOUSE" VidPid="VID_0000&PID_0000"/>
</DevicesList>
</RootHub>
但我需要的是:
<RootHub>
<Hub20 Tag="HUB1" VidPid="VID_0000&PID_0000"/>
<Switch Tag="SWITCH1" />
<Device Tag="MOUSE" VidPid="VID_0000&PID_0000"/>
</RootHub>
我已经尝试过这个问题 Getting rid of an array name in C# XML Serialization 的解决方案,但它不起作用,因为无法将 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; }
我正在尝试序列化下面的对象,但没有列表的根名称我无法序列化它。 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&PID_0000"/>
<Switch Tag="SWITCH1" />
<Device Tag="MOUSE" VidPid="VID_0000&PID_0000"/>
</DevicesList>
</RootHub>
但我需要的是:
<RootHub>
<Hub20 Tag="HUB1" VidPid="VID_0000&PID_0000"/>
<Switch Tag="SWITCH1" />
<Device Tag="MOUSE" VidPid="VID_0000&PID_0000"/>
</RootHub>
我已经尝试过这个问题 Getting rid of an array name in C# XML Serialization 的解决方案,但它不起作用,因为无法将 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; }