2009-07-16 6 views
9

Sto utilizzando XmlSerializer.Serialize e produce interruzioni di riga e spazi non necessari. Come evitarlo?Come serializzare un XML senza spazi inutili e interruzioni di riga? (.NET)

+0

Vecchio, ma credo che la differenza sia se si utilizza un XmlWriter o un TextWriter. Nella mia esperienza, XmlWriter non ha alcuna formattazione. Questo ha senso, perché sa che sta scrivendo un documento in cui la formattazione non ha importanza, mentre uno scrittore di testi sta scrivendo direttamente del testo. – Timothy

risposta

17

Forse è possibile utilizzare il sovraccarico accettando un XmlWriter e configurare il XmlWriter dato con un'istanza XmlWriterSettings?

XmlWriterSettings consente di controllare l'applicazione di interruzioni di riga e rientro.

void Serialize(Object o) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = false; 
    settings.NewLineHandling = NewLineHandling.None; 
    //settings.OtherProperties = values; 

    using (XmlWriter writer = XmlWriter.Create(CreateStream(), settings)) 
    { 
     _serializer.Serialize(writer, o); 
    } 
} 
+0

ha funzionato, grazie –

+1

Ho dovuto cambiare i parametri in questo modo: '_serializer.Serialize (writer, o);'. Ottima soluzione, grazie! –

2

È interessante, ho pensato che non ci fosse alcuna formattazione di default. Ho appena provato il seguente e non ho ricevuto la formattazione:

using (var stream = new MemoryStream()) 
{ 
    System.Text.Encoding encoding; 
    using (var writer = XmlWriter.Create(stream)) 
    { 
     if (writer == null) 
     { 
      throw new InvalidOperationException("writer is null"); 
     } 

     encoding = writer.Settings.Encoding; 
     var ser = new XmlSerializer(obj.GetType()); 
     ser.Serialize(writer, obj); 
    } 

    stream.Position = 0; 
    using (var reader = new StreamReader(stream, encoding, true)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

in una corsa del campione, è tornato il seguente codice XML:

<?xml version="1.0" encoding="utf-8"?><obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><childOne /><childTwo /><text>text1</text><text>text2</text></obj> 
+2

Forse ti piace di più =) –

+0

Tale incoerenza dovrebbe essere segnalata a Microsoft. Un metodo non può comportarsi in modi diversi. È dipendente dalla cultura? O è una versione .NET/Service Pack? Non lo so ancora. –

+0

Se hai la possibilità, esegui il codice che ho postato. Sto usando .NET 3.5 SP1. Vediamo qual è la vera differenza. –

0

Si prega di verificare anche se le classi serializzato contengono membri di XML-tipo (come XmlElement). Ho usato lo strumento Xsd2Code per generare classi da XSD e (in casi molto particolari) ha creato un membro di tipo XmlElement. Durante la serializzazione questo membro ha la sua formattazione (l'identificazione è esatta). Anche se avessi attivato o disattivato il rientro XmlSerializer, non aveva alcun effetto sul membro XmlElement.

Problemi correlati