.net XmlSerializer,忽略基类属性

假设我们从基类“System.Windows.Controls”中有一个派生类“SerializableLabel”。

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

我想序列化这个类,但忽略父类中的所有属性。 理想情况下,xml看起来像:

  bar  

如何最好地实现这一目标?

我的第一次尝试使用了典型的XmlSerializer方法:

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

但是这会引发exception,因为序列化程序会尝试序列化一个基类属性,这是一个接口(ICommand Command)。

上述问题的一个可能根源(包括JP指出的问题)是您的类层次结构试图违反Liskov替换原则 。 简单来说,派生类尝试执行基类已经执行的操作。 换句话说,您正在尝试创建一个不能替代基本标签的派生标签。

这里最有效的补救措施可能涉及解耦SerializableLabel试图做的两件事,(a)与UI相关的函数和(b)存储可序列化的数据,并将它们放在不同的类中。

如果要在序列化期间忽略属性,可以使用Xml属性覆盖。
有关属性覆盖的介绍,请参阅此问题 。

您可以使用IXmlSerializable编写自定义序列化程序,但是您可能会创建一个序列化无法正确重构类的情况。 假设有人在您的SerializableLabel上使用了BackColor,这不会通过序列化过程正常进行。

在text.xml文件中,您可能希望将根重命名为SerializableLabel,而不是SerializableLable(小错字)