2012-03-14 59 views
0

我試圖創建一個函數,將我的應用程序的當前狀態保存到一個文件,另一個函數加載保存的文件。目前,所有的信息都包含在一個對象中,而這個對象又是指其他對象。我最近聽說C#有一些內置的類,可以幫助你序列化和反序列化你的對象,所以我做了一些研究並瞭解了DataContracts,主要來自這個頁面:http://msdn.microsoft.com/en-us/library/ms731073.aspx如何序列化繼承內置c#類的對象?

大部分工作,除了類實現內置的類。例如,我有一個繼承System.Windows.DependencyObject的對象,當我嘗試序列化它時,它抱怨我的類繼承了一個沒有DataContract屬性的類。

這對我來說是有道理的,爲什麼這會是一個問題。當一個對象被反序列化時,它的構造函數不會被調用。如果它繼承了一些不可序列化的東西,那可能會使其處於無效狀態。

我想知道這是否可能:我可以以某種方式告訴反序列化器在反序列化我的對象之前調用基類的默認構造函數嗎?然後我不得不告訴序列化器不要嚇壞了。

+0

大多數序列化框架允許您在序列化期間忽略(例如XmlIgnore)您的一些屬性,並讓您運行自定義的反序列化邏輯。 – ziya 2012-03-14 20:41:04

+0

問題是我沒有訪問基類,因爲它在標準的C#庫中。如果我創建了基類,那麼很容易使它可序列化並告訴它該忽略什麼。 – hypehuman 2012-03-14 20:52:32

+0

'當一個對象被反序列化時,它的構造函數不會被調用,這是不正確的。它被你的序列化器通過反射調用(不是顯式的)(實際上,它在創建實例時被調用) – 2012-03-14 20:53:45

回答

1

您可以創建一個數據傳輸對象,該對象具有您要存儲的所有屬性,然後使用框架對象中的數據填充該對象?將它標記爲序列化,啓動您選擇的序列化類 - 現在您擁有了所有需要的信息。您只需在反序列化之後重新填充相應的類。

+0

這是一個好主意,但似乎比它應該更難。請參閱下面的解決方案 – hypehuman 2012-03-16 20:36:20

0

您可能想要考慮使用二進制序列化程序或xml序列化程序,而不是此數據協定序列化程序。如果你將它保存到文件中,並且不需要文件,那麼人類可讀的二進制序列化幾乎總是有效的。

請參閱Binary Serialization,特別是Basic Serialization主題。 也可以看看XmlSerializer Class,它有時會在DataContractSerializer沒有的地方工作。

+0

這也是一個好主意,但重要的是輸出是人類可讀的。 – hypehuman 2012-03-16 20:37:26

+0

好的...在這種情況下,我會嘗試使用XmlSerializer,如果這樣做不能解決問題,那麼您可能正在通過在您的類上實現IXmlSerializable來實現自定義序列化。 – JamieSee 2012-03-16 21:47:28