2010-08-13 20 views
5

Ho una classe come questa:Questo XmlWriter non supporta i dati codificati base64

public class Data 
{ 
    public string Name { get; set; } 
    public int Size { get; set; } 
    public string Value { get; set; } 

    [NonSerialized] public byte[] Bytes; 
} 

Quando un List<Data> colpisce il metodo di serializzazione di seguito, muore di tanto in tanto con

InvalidOperationException "Questo XmlWriter fa non supporta i dati codificati base64 . "

Come si può vedere, non sto codificando direttamente nulla, semplicemente utilizzando il meccanismo di serializzazione predefinito.

private static XDocument Serialize<T>(T source) 
{ 
    var target = new XDocument(); 
    var s = new XmlSerializer(typeof(T)); 
    using(XmlWriter writer = target.CreateWriter()) 
    { 
     s.Serialize(writer, source); 
    } 
    return target; 
} 

I dati dovranno Name proprietà che sono le parole inglesi separate da trattini. La proprietà Value sarà simile, tranne che con operatori o numeri matematici aggiunti (sono espressioni matematiche).

Qualcuno sa cosa lo sta causando e come posso correggerlo?

risposta

4

Utilizzare [XmlIgnore] anziché [NonSerialized]. Quest'ultimo è per il sapone e binari formattatori, secondo MSDN:

Quando si utilizza BinaryFormatter o classi SoapFormatter per serializzare un oggetto , utilizzare l'attributo NonSerializedAttribute per impedire un campo da sia serializzati. Ad esempio, è possibile utilizzare per impedire la serializzazione di dati riservati.

Gli oggetti di destinazione per l'attributo NonSerializedAttribute sono campi pubblici e privati ​​di una classe serializzabile . Per impostazione predefinita, le classi non sono serializzabili a meno che siano contrassegnate con SerializableAttribute. Durante il processo di serializzazione , tutti i pubblici e i campi privati ​​di una classe sono serializzati per impostazione predefinita. I campi contrassegnati con con NonSerializedAttribute sono esclusi durante la serializzazione. Se utilizza la classe XmlSerializer su serializzare un oggetto, utilizzare la classe XmlIgnoreAttribute per ottenere la stessa funzionalità .

si badi bene, sono sorpreso il tuo codice originale compila anche - quando ho provato, si dice che [NonSerialized] può essere applicato solo ai campi ...

+0

è stato facile, accetterà quando così mi lascia ... :) Grazie –

+0

Il 'applicato solo ai campi' ... scusate, era un artefatto di me che disinfettava il codice prima di postare. Modificato la domanda per risolverlo. –

+0

@ Lucas: abbastanza giusto :) Sono contento che abbia funzionato. –

Problemi correlati