C# .net XmlSerializer,忽略基类属性

C# .net XmlSerializer,忽略基类属性,c#,.net,xml-serialization,C#,.net,Xml Serialization,假设我们有一个从基类“System.Windows.Controls”派生的类“SerializableLabel” [XmlRoot("SerializableLabel")] public class SerializableLabel : Label { public string foo = "bar"; } 我想序列化该类,但忽略父类中的所有属性。理想情况下,xml应该类似于: <SerializableLable> <foo>bar</

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

[XmlRoot("SerializableLabel")]
public class SerializableLabel : Label
{
    public string foo = "bar";
}
我想序列化该类,但忽略父类中的所有属性。理想情况下,xml应该类似于:

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

但这会引发异常,因为序列化程序尝试序列化作为接口的基类属性(ICommand命令).

您可以使用编写自定义序列化程序,但会造成序列化无法正确重建类的情况。例如,有人使用SerializableLabel上的背景色,这将无法正确完成序列化过程。

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

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


这里最有效的补救方法可能包括将SerializableLabel尝试做的两件事分离开来,(a)与UI相关的函数和(b)存储可序列化的数据,并将它们放在不同的类中。

如果要在序列化过程中忽略属性,可以使用Xml属性重写。

有关属性重写的介绍,请参阅。

谢谢您的回答!我似乎违反了Liskov替换原则。这可能是因为我非常热衷于忽略基类中的属性。事实上,我只想忽略阻止标签序列化的属性-例如,类型为int的属性艾尔菲斯。
XmlSerializer s = new XmlSerializer(typeof(SerializableLabel));
TextWriter w = new StreamWriter("test.xml");
s.Serialize(w, lbl);
w.Close();