2011-02-02 5 views
5

Ho una struct più o meno così:Come posso sovrascrivere il nome serializzato di ciascuna voce di elenco in una lista <SomeStruct>() in C#?

[Serializable] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    string CustomerNo; 
    string Name; 
} 

volte mi serializzare questo questa struttura per XML come un unico oggetto, che funziona bene, ma ho anche a volte bisogno di serializzare un elenco <> di questa struct .

Ho usato questo per impostare la parte superiore nome elemento di livello:

[Serializable] 
[XmlRoot("Customers")] 
public class CustomerList : List<TCustomer> { } 

XmlSerializer tuttavia, insiste a chiamare ogni voce dell'elenco TCliente. Come posso comunicare a XmlSerializer di utilizzare il nome Cliente invece di TCustomer?

risposta

2

Grazie per tutte le risposte. La soluzione al mio problema specifico, tuttavia, si è rivelata semplice:

[XmlRoot("Customers")] 
public class Customers 
{ 
    [XmlElement("Customer")] 
    public List<TCustomer> List = new List<TCustomer>(); 
} 
+0

Esattamente quello che stavo cercando! Grazie! – Sergey

1

Non l'ho mai provato a livello di classe/struct, ma questo è il modo in cui lo faccio quando ho bisogno di serializzare una lista all'interno di una classe.

[XmlArray("ConfigurationList")] 
    [XmlArrayItem("Configuration")] 
    private List<string> pConfigList = new List<string>(); 
0

È possibile implementare IXmlSerializable al fine di personalizzare il modo in cui un oggetto viene serializzato:

IXmlSerializable Interface

In ogni caso, sembra che serializzatore chiama TCustomer il tipo di elementi perché questo è il tipo effettivo di il List (TCustomer è ???, dove ??? sarà il tipo effettivo del tipo di parametro generico TCustomer).

Non cambierei il modo in cui XmlSerializer serializza gli oggetti senza implementare IXmlSerializable (Voglio dire, evitare una sostituzione del testo post-serializzazione o qualsiasi altra cosa!).

7

Speranza che aiuta

[XmlType("Customer")] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    public string CustomerNo; 
    public string Name; 
} 
+0

Bello! Sarebbe bello se tu potessi spiegare, però? –

+0

Controlla lo schema XML generato quando la destinazione dell'attributo viene serializzata da XmlSerializer. - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

Questo è più corretto: inizializza una nuova istanza della classe XmlTypeAttribute e specifica il nome del tipo XML. - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

L'attributo XmlRoot vale solo per l'elemento principale, in modo che non si applica per TCustomer quando si è serializzazione CustomerList.

Senza implementare la propria serializzazione, non credo che si può cambiare TCustomer per serializzare come Customer all'interno della classe CustomerList. Ma si può fare qualcosa di simile ...

[Serializable] 
[XmlRoot("customerList")] 
public class CustomerList 
{ 
    [XmlArray("customers")] 
    [XmlArrayItem("customer")] 
    public List<TCustomer> Customers { get; set; } 
} 

Questo dovrebbe darvi XML simile a:

<customerList> 
    <customers> 
     <customer /> 
     <customer /> 
     <customer /> 
    </customers> 
</customerList> 

Questo cambia il tuo CustomerList da un elenco generico, ma permette di controllare la denominazione.

+0

Non ho ancora visto un caso in cui la risposta accettata funziona anche per la serializzazione dei nomi degli oggetti per i tipi standard come 'Lista MyList', questa risposta è tuttavia abbastanza flessibile da gestire i nomi dei tag secondari di ridenominazione in quel caso particolare. Inoltre, se hai solo bisogno di rinominare i tag dell'elemento list, ho notato che solo il '[XmlArrayItem (" customer ")]' è effettivamente necessario – Henrik