2009-07-07 106 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