2009-10-26 10 views
18

Ho una matrice di oggetti che desidero serializzare come XML. Questi oggetti sono annotati per impostare i nomi dei nodi XML, ma mi chiedevo come impostare il nome del nodo radice XML.Come impostare il nome del nodo radice quando XmlSerializing un array?

Il codice simile a questo:

// create list of items 
List<ListItem> list = new List<ListItem>(); 
list.Add(new ListItem("A1", new Location(1, 2))); 
list.Add(new ListItem("A2", new Location(2, 3))); 
list.Add(new ListItem("A3", new Location(3, 4))); 
list.Add(new ListItem("A4<&xyz>", new Location())); 

// serialise 
XmlSerializer ser = new XmlSerializer(typeof(ListItem[])); 
FileStream os = new FileStream(@"d:\temp\seri.xml", FileMode.Create); 
ser.Serialize(os, list.ToArray()); 
os.Close(); 

L'output è simile al seguente:

<?xml version="1.0"?> 
<ArrayOfPlace xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Place> 
    <Placename>A1</Placename> 
    <Location> 
     <Lat>1</Lat> 
     <Long>2</Long> 
    </Location> 
    </Place> 
    <Place> 
    ... 

ListItem è stato rinominato in Luogo utilizzando un XmlElement annotazione, ma come può Ho impostato il nome del nodo radice per rinominare il nodo "ArrayOfPlace"?

risposta

28

Prova questo:

XmlSerializer ser = new XmlSerializer(
    typeof(ListItem[]), 
    new XmlRootAttribute("CustomRootName")); 
+0

Si noti che è necessario memorizzare in cache il serializzatore per riutilizzarlo in un secondo momento, altrimenti si verificherà una grave perdita di memoria. Vedi [Memory Leak usando StreamReader e XmlSerializer] (https://stackoverflow.com/questions/23897145/memory-leak-using-streamreader-and-xmlserializer/) – dbc

0

appena trovato me stesso una soluzione.

È possibile impostare il nome del nodo radice durante l'istanziazione di XmlSerializer. Vedi sotto.

XmlSerializer ser = new XmlSerializer(typeof(ListItem[]), new XmlRootAttribute("AllPlaces")); 
Problemi correlati