假设我们从基类“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)。
答案 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(小错字)