2016-07-07 36 views
6

Quando seralizing una classe e salvare in un file, a volte si verifica un errore in cui l'output serializzato è simile al seguente: sguardiLa serializzazione XML produce stringhe casuali alla fine? C#

<?xml version="1.0"?> 
<Template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Route>Some Route</Route> 
    <TradePack>Something Here</TradePack> 
    <Transport /> 
</Template>te> ------> Notice this extra string? 

La classe che sto serializzazione in questo modo:

[Serializable] 
public class Template 
{ 
    public string Route = string.Empty; 
    public string TradePack = string.Empty; 
    public string Transport = string.Empty; 

    public Template() 
    { 

    } 
} 

I non riesco a capire perché questo sta accadendo. Ecco la mia classe serializzatore:

public static bool Save(object obj, string path) 
    { 
     try 
     { 
      XmlSerializer writer = new XmlSerializer(obj.GetType()); 

      using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) 
      { 
       writer.Serialize(stream, obj); 
      } 

      return true; 
     } 
     catch { } 
     return false; 
    } 

Grazie!

+3

Ho avuto un problema simile una volta, da parte mia è stata colpa del fatto che il file non è stato completamente pulito. Rimaneva sempre un pezzo. Forse cancella il file prima di scriverci. –

+0

Ah ha senso, grazie! :) –

+0

Quindi, come mi aspettavo. Non è quasi mai casuale;). – Aphelion

risposta

8

L'output aggiuntivo è probabilmente un residuo di una versione precedente del file di output (con lo stesso nome).

È possibile risolvere il problema modificando il FileMode da OpenOrCreate a Create solo. In questo modo il file di output viene troncato se già esiste.

Un metodo ancora più semplice sarebbe quella di utilizzare File.Create(path):

XmlSerializer writer = new XmlSerializer(obj.GetType()); 
using (var stream = File.Create(path)) 
{ 
    writer.Serialize(stream, obj); 
} 

Per inciso: Di solito è preferibile lasciare che le eccezioni bolla la chiamata di stack fino a quando si può fare qualcosa di significativo con loro. Basta ingoiare silenziosamente l'eccezione e invece restituire un flag di stato che potrebbe non essere mai verificato nasconde il problema reale, potrebbe portare a ulteriori problemi in seguito e rende l'analisi di un problema inutilmente difficile.

+0

E citiamo la scorciatoia 'File.Create (percorso)'. –

+0

Ho modificato FileMode per troncare e in precedenza creare il file se non esiste ancora. –

+0

@HenkHolterman Questo non è molto lavoro, inoltre non mi piace usare le librerie esterne quando non è necessario. –

Problemi correlati