更改列表序列化为 XML 的方式

Change the way how list is serialized into XML

所以,我有一个 class 对象列表,如下所示:

public int SourceId { get; set; }
public int TargetId { get; set; }
public List<ExtraParameter> ExtraParameters { get; }

然后序列化成XML文件时,输出是这样的:

<Connection>
    <SourceId>0</SourceId>
    <TargetId>1</TargetId>
    <ExtraParameters>
      <ExtraParameter>
        <Input>0</Input>
        <Output>1</Output>
        <Enabled>true</Enabled>
      </ExtraParameter>
      <ExtraParameter>
        <Input>1</Input>
        <Output>0</Output>
        <Enabled>true</Enabled>
      </ExtraParameter>
     </ExtraParameters>
</Connection>

但我需要使用 C# 的 XmlSerializer 将此元素数组 (ExtraParameter) 序列化为以下形式:

<Connection>
   <SourceId>0</SourceId>
   <TargetId>1</TargetId>
   <ExtraParameter>
      <Input>0</Input>
      <Output>1</Output>
      <Enabled>true</Enabled>
   </ExtraParameter>
   <ExtraParameter>
      <Input>1</Input>
      <Output>0</Output>
      <Enabled>true</Enabled>
   </ExtraParameter>
</Connection>

换句话说,我能否以某种方式仅列出该 ExtraParameters 列表中的项目,而无需在此层次结构中包含该列表?所以看起来 ExtraParameters 中的对象确实只是列在 TargetID 节点的末尾。

编辑:是的,我知道,这有点破坏了结构,但是这个 xml 文件随后被下一个程序正确反序列化,我无法控制它。

您可以通过将 XmlElement 属性添加到相关的 属性 来实现。每 the docs:

If you apply the XmlElementAttribute to a field or property that returns an array, the items in the array are encoded as a sequence of XML elements.

[XmlElement("ExtraParameter")]
public List<ExtraParameter> ExtraParameters { get; }

您还可以更改 属性 名称,而不是为属性添加 ElementName 的值。

有关工作演示,请参阅 this fiddle