【问题标题】:C# - XML serialization of derived classesC# - 派生类的 XML 序列化
【发布时间】:2013-09-02 10:11:09
【问题描述】:

我正在尝试序列化多个元素(供应商、客户、产品等)的列表,所有元素都派生自同一个类 (MasterElement)

public class XMLFile
{
    [XmlArray("MasterFiles")]
    public List<MasterElement> MasterFiles;
    ...
}

[XmlInclude(typeof(Supplier))]
[XmlInclude(typeof(Customer))]
public abstract class MasterElement
{
    public MasterElement() 
    {

    }
}

[XmlType(TypeName = "Supplier")]
public class Supplier: MasterElement
{
    public string SupplierID;
    public string AccountID;
}

[XmlType(TypeName = "Customer")]
public class Customer: MasterElement
{
    public string CustomerID;
    public string AccountID;
    public string CustomerTaxID;
}

到目前为止,XML正在解析,但当前输出是

<MasterFiles>
    <MasterElement xsi:type="Supplier">
        <SupplierID>SUP-000001</SupplierID>
        <AccountID>Unknown</AccountID>
    </MasterElement>
    <MasterElement xsi:type="Customer">
        <CustomerID>CLI-000001</CustomerID>
        <AccountID>Unknown</AccountID>
        <CustomerTaxID>Unknown</CustomerTaxID>
    </MasterElement>
</MasterFiles>

但我想要的是

<MasterFiles>
    <Supplier>
        <SupplierID>SUP-000001</SupplierID>
        <AccountID>Unknown</AccountID>
    </Supplier>
    <Customer>
        <CustomerID>CLI-000001</CustomerID>
        <AccountID>Unknown</AccountID>
        <CustomerTaxID>Unknown</CustomerTaxID>
    </Customer>
</MasterFiles>

我在这里做错了什么?

【问题讨论】:

    标签: c# xml xml-serialization xmlserializer


    【解决方案1】:

    您可以使用XmlArrayItem 来解决这个问题:

    public class XMLFile
    {
        [XmlArray("MasterFiles")]
        [XmlArrayItem("Supplier", typeof(Supplier))]
        [XmlArrayItem("Customer", typeof(Customer))]
        public List<MasterElement> MasterFiles;
    }
    

    来自链接的 MSDN:

    XmlArrayItemAttribute 支持多态性——换句话说,它 允许 XmlSerializer 将派生对象添加到数组中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多