2010-08-13 8 views
5

ich eine Klasse wie dieses:Diese XmlWriter unterstützt nicht Base64-codierte Daten

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

    [NonSerialized] public byte[] Bytes; 
} 

Wenn ein List<Data> die Serialisierungsmethode unten trifft, stirbt es gelegentlich mit

InvalidOperationException „Das XmlWriter tut nicht unterstützt base64 codierte Daten. "

Wie Sie sehen können, bin ich nicht direkt codieren nichts, nur mit dem Standard-Serialisierungsmechanismus.

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; 
} 

Die Daten werden Name Eigenschaften haben, die von Unterstrichen englischen Wörter getrennt sind. Die Value -Eigenschaft wird ähnlich sein mit Ausnahme von mathematischen Operatoren oder Zahlen (sie sind mathematische Ausdrücke).

Wer weiß, was es verursacht und wie ich es beheben kann?

Antwort

4

Verwenden [XmlIgnore] statt [NonSerialized]. Letzteres ist für die Seife und binäre Formatierer nach MSDN:

Wenn die BinaryFormatter oder SoapFormatter Klassen unter Verwendung eines Objekt serialisieren, das Attribut NonSerializedAttribute verwenden, um ein Feld zu verhindern serialisiert werden. Zum Beispiel können Sie dieses Attribut verwenden, um die Serialisierung von sensiblen Daten zu verhindern.

Die Zielobjekte für die NonSerializedAttribute Attribute sind öffentliche und private Felder einer serializable Klasse. Standardmäßig sind Klassen nicht serialisierbar, es sei denn sie mit SerializableAttribute gekennzeichnet sind. Während des Serialisierungsprozeß alle öffentlichen und private Felder einer Klasse werden standardmäßig serialisiert. Felder mit NonSerializedAttribute sind während der Serialisierung ausgeschlossen. Wenn Sie die XmlSerializer-Klasse zu serialisieren ein Objekt verwenden, verwenden Sie die XmlIgnoreAttribute-Klasse, um die gleiche Funktionalität zu erhalten.

Wohlgemerkt, ich bin Ihr Original-Code selbst kompiliert überrascht - wenn ich es versuchen, es sagt, dass [NonSerialized] können nur auf Felder angewendet werden ...

+0

, die einfach war, akzeptieren, wenn SO lässt mich ... :) Danke –

+0

Das 'nur für Felder angewendet' ... Entschuldigung, das war ein Artefakt von mir den Code vor dem Posten zu sanieren. Bearbeitete die Frage, um es zu beheben. –

+0

@Lucas: Fair genug :) Froh, es hat funktioniert. –

Verwandte Themen