2013-09-02 19 views
8

Sto cercando di serializzare un elenco di più elementi (fornitori, clienti, prodotti, ecc), tutte derivanti dalla stessa classe (MasterElement)C# - serializzazione XML di classi derivate

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; 
} 

Finora, l'XML è l'analisi, ma l'uscita di corrente è

<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> 

ma quello che voglio è

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

Cosa am Sto sbagliando qui?

risposta

7

È possibile utilizzare XmlArrayItem per aggirare il problema:

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

da MSDN collegato:

Il XmlArrayItemAttribute supporta il polimorfismo - in altre parole, permette il XmlSerializer di aggiungere oggetti derivati a un array.

+0

Grazie, ha funzionato perfettamente :) –