【问题标题】:C# XML Serializing list with element name depending on classC# XML 序列化列表,元素名称取决于类
【发布时间】:2017-01-16 21:04:57
【问题描述】:

我想序列化一个包含DerivedClassADerivedClassBList<AbstractClass>,其中这两个类都派生自AbstractClass

另外,我想为包含列表中每个元素的元素添加一个属性。我想要的输出是这样的:

<MyCustomListName foo="bar">
    <DerivedClassA baseAttribute="value" attributeFromA="value"/>
    <DerivedClassB baseAttribute="value" attributeFromB="value"/>
    ...
</MyCustomListName> 

到目前为止,我所拥有的是:

public class MyCustomListName
{
   [XmlAttribute]
   public string foo {get; set;}

   [XmlArray]        
   public List<AbstractClass> list { get; set; }

}

[XmlInclude(typeof(DerivedClassA))]
[XmlInclude(typeof(DerivedClassB))]
public abstract class AbstractClass
{
   [XmlAttribute]
   public string baseAttribute {get; set;}
}

public class DerivedClassA : AbstractClass
{
   [XmlAttribute]
   public string attributeFromA {get; set;}
}

public class DerivedClassB : AbstractClass
{
   [XmlAttribute]
   public string attributeFromB {get; set;}
}

使用这个,我得到以下输出:

<MyCustomListName foo="bar">
  <list>
    <AbstractClass xsi:type="DerivedClassA" baseAttribute="value" attributeFromA="value"/>
    <AbstractClass xsi:type="DerivedClassB" baseAttribute="value" attributeFromB="value"/>
  </list>
</MyCustomListName>

因此,要获得我想要的输出,不应该有嵌套的 &lt;list&gt; 元素,而不是 xsi:type 属性,元素名称应该是 DerivedClassADerivedClassB,具体取决于类型。

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    为不同类型的项目提供不同的名称:

    [XmlElement("derivedA", typeof(DerivedClassA))]
    [XmlElement("derivedB", typeof(DerivedClassB))]
    public List<AbstractClass> list { get; set; }
    

    【讨论】:

    • 这似乎适用于创建正确的元素名称。但是,我不需要输出&lt;list&gt; 标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多