.net XmlSerializer,忽略基类属性

时间:2009-07-07 01:37:30

标签: c# .net xml-serialization

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

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

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

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

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

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

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

但是这引发了一个异常,因为序列化程序试图序列化一个基类属性,它是一个接口(ICommand Command)。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以使用IXmlSerializable编写自定义序列化程序,但是您会创建一种情况,即序列化不会正确地重新构建类。假设有人在您的SerializableLabel上使用了BackColor,它不能正确地通过序列化过程。

答案 3 :(得分:0)

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