2009-07-07 67 views
3

可以说,我们从基类“System.Windows.Controls一derivided类“SerializableLabel”。.NET XmlSerializer的,忽略基类的属性

[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的命令),这引发了一个异常。

回答

1

之一上述问题可能的根(包括一个所指出的太平绅士)是您的班级体系会尝试违反Liskov Substitution Principle。简而言之,派生类尝试而不是来完成基类已经做的事情。换句话说,你正试图创建一个不能替代基本标签的派生标签。

这里最有效的补救措施可能涉及脱钩两件事情,SerializableLabel是试图做,(一)UI相关的功能和(b)存储系列化的数据,并让他们在不同的班级。

+0

感谢您的回答! 这看起来好像我违反了Liskov替代原则。也许这是因为我对于忽视基类中的属性而相当热心。事实是,我只想忽略阻止标签序列化的属性 - 例如那些类型为接口的属性。 – ccunni 2009-07-07 16:58:21

0

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

0

在你text.xml文件,你可能要重命名的根是SerializableLabel,不SerializableLable(小错字)

1

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

+0

这有帮助,谢谢 – ccunni 2009-07-08 16:06:46