2009-07-07 1 views
3

Lets sagen, dass wir eine derivided Klasse „SerializableLabel“ von der Basisklasse „System.Windows.Controls haben..net XmlSerializer, ignorieren Eigenschaften Basisklasse

[XmlRoot("SerializableLabel")] 
public class SerializableLabel : Label 
{ 
    public string foo = "bar"; 
} 

ich diese Klasse serialisiert werden möchten, aber alle ignorieren . der Eigenschaften in der übergeordneten Klasse im Idealfall würde die xml etwas wie folgt aussehen:?

<SerializableLable> 
    <foo>bar</foo> 
</SerializableLable> 

Wie dies am besten erreicht ist

Mein erster Versuch verwendet, um den typischen XmlSerializer Ansatz:

XmlSerializer s = new XmlSerializer(typeof(SerializableLabel)); 
TextWriter w = new StreamWriter("test.xml"); 
s.Serialize(w, lbl); 
w.Close(); 

Aber das wirft eine Ausnahme, weil der Serializer versucht, eine Basisklasse Eigenschaft serialisiert werden, das ist eine Schnittstelle (ICommand Command).

Antwort

1

Eine mögliche Ursache für die oben genannten Probleme (einschließlich der darauf hingewiesen durch JP) zu sein, ist, dass Ihre Klassenhierarchie versucht, die Liskov Substitution Principle zu verletzen. In einfacheren Worten versucht die abgeleitete Klasse nicht zu tun, was die Basisklasse bereits tut. Mit anderen Worten, Sie versuchen, eine abgeleitete Beschriftung zu erstellen, die nicht durch die Basisbeschriftung ersetzt werden kann.

Das wirksamste Mittel hier beinhalten kann, die beiden Dinge, die Entkopplung, dass SerializableLabel versucht, zu tun ist, (a) UI-bezogene Funktionen und (b) Speichern serializable Daten, und sie in verschiedenen Klassen haben.

+0

Danke für Ihre Antworten! Es scheint so, als würde ich das Liskow-Substitutionsprinzip verletzen. Vielleicht liegt es daran, dass ich eifrig darauf bedacht bin, Eigenschaften in der Basisklasse zu ignorieren. Die Wahrheit ist, ich möchte nur Eigenschaften ignorieren, die die Serialisierung des Etiketts verhindern - zB diejenigen, deren Typ eine Schnittstelle ist. – ccunni

0

Sie könnten einen benutzerdefinierten Serializer mit IXmlSerializable schreiben, aber Sie würden eine Situation erstellen, in der Ihre Serialisierung die Klasse nicht ordnungsgemäß wiederherstellt. Lassen Sie uns jemand die BackColor auf Ihrem SerializableLabel sagen, die nicht richtig durch den Serialisierungsprozess kommen würde.

0

In Ihrem text.xml Datei, möchten Sie vielleicht die Wurzel umbenennen SerializableLabel, nicht SerializableLable (kleiner Tippfehler)

1

Wenn Sie Eigenschaften während der Serialisierung ignorieren möchten, können Sie Xml Attribute-Overrides verwenden.
Siehe this question für ein Intro zum Überschreiben von Attributen.

+0

das hat geholfen, danke – ccunni