2009-11-15 13 views
8

Mentre provavo a rispondere a un'altra domanda, stavo serializzando un oggetto C# su una stringa XML. Era sorprendentemente difficile; questo è stato il più breve frammento di codice potrei venire con:Un modo più semplice per serializzare la classe C# come testo XML

var yourList = new List<int>() { 1, 2, 3 }; 
var ms = new MemoryStream(); 
var xtw = new XmlTextWriter(ms, Encoding.UTF8); 
var xs = new XmlSerializer(yourList.GetType()); 
xs.Serialize(xtw, yourList); 
var encoding = new UTF8Encoding(); 
string xmlEncodedList = encoding.GetString(ms.GetBuffer()); 

Il risultato è a posto:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfInt 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <int>1</int> 
    <int>2</int> 
    <int>3</int> 
</ArrayOfInt> 

Ma il frammento è più complicato di quanto penso che dovrebbe essere. Non posso credere che tu debba sapere su encoding e MemoryStream per questo semplice compito.

C'è un modo più breve per serializzare un oggetto in una stringa XML?

risposta

19

Un po 'più corta :-)

var yourList = new List<int>() { 1, 2, 3 }; 
using (var writer = new StringWriter()) 
{ 
    new XmlSerializer(yourList.GetType()).Serialize(writer, yourList); 
    var xmlEncodedList = writer.GetStringBuilder().ToString(); 
} 

Anche se c'è un difetto con questo approccio precedente che vale la pena sottolineare. Genererà un'intestazione utf-16 poiché utilizziamo lo StringWriter, quindi non è esattamente equivalente al tuo codice. Per ottenere utf-8 intestazione dovremmo usare un MemoryStream ed un XmlWriter che è una riga aggiuntiva di codice:

var yourList = new List<int>() { 1, 2, 3 }; 
using (var stream = new MemoryStream()) 
{ 
    using (var writer = XmlWriter.Create(stream)) 
    { 
     new XmlSerializer(yourList.GetType()).Serialize(writer, yourList); 
     var xmlEncodedList = Encoding.UTF8.GetString(stream.ToArray()); 
    } 
} 
+1

Ancora più breve se non si esegue 'GetStringBuilder()' –

+1

Grazie, SQL Server accetta solo la versione UTF-8. Immagino sia semplice come succede in C# ... – Andomar

+2

@Andomar: non avevo mai visto questa domanda prima ... puoi evitare parte di questo codice usando la mia classe Utf8StringWriter. Vedi http://stackoverflow.com/questions/3862063 –

0

Scrivere un metodo di estensione o una classe/funzione wrapper per incapsulare lo snippet.

+4

CHE NON in particolare, renderlo più semplice: basta ricollocare la complessità (sebbene implichi un livello di riutilizzo). – Murph

0

Non hanno bisogno del MemoryStream, basta usare un StringWriter:

var yourList = new List<int>() { 1, 2, 3 }; 
using (StringWriter sw = new StringWriter()) 
{ 
    var xs = new XmlSerializer(yourList.GetType()); 
    xs.Serialize(sw, yourList); 
    string xmlEncodedList = sw.ToString(); 
} 
+3

che sarà UTF-16, non UTF-8 –

Problemi correlati