2012-02-03 34 views
3

在我自己的對象上,我可以添加元標記[Serializable]使其可序列化。現在我使用第三方庫,我需要序列化。我檢查了代碼,它不應該是一個問題。有沒有辦法解決這個問題,而不改變第三方代碼?c#:使第三方對象可序列化

+1

你不能只是子類嗎? – vulkanino 2012-02-03 13:18:40

+0

這很大程度上取決於:哪個序列化程序(是否是BinaryFormatter?),以及b:類型是什麼樣的;個人而言,我只是使用單獨的數據模型。 – 2012-02-03 13:27:16

回答

6

我的建議是:序列數據,不實現。存在第三方對象的事實與數據無關;那是一個實現細節。因此,我總是提供相同的建議:如果系列化有史以來變得複雜,首先要做的是引入一個單獨的DTO模型,代表數據孤立的實現,並只是將當前狀態映射到DTO。這允許您處理實現更改而不影響存儲,並允許序列化不可序列化的對象。

一些序列化器提供瞭解決方法 - 例如protobuf-net,您可以:a在運行時爲任何類型提供序列化信息,b:提供一個「代理」以便在棘手時自動使用,但是 - 使用DTO型號更簡單,更易於維護。

您使用[Serializable]建議BinaryFormatter;在我看來,這是幾乎從來沒有任何類型的存儲的好選擇,因爲BinaryFormatter依賴於實現細節。它很適合在兩個同步應用程序域之間傳遞數據,但

+0

問題是我需要序列化的對象已經是DTO對象的一部分,並且由webcomponents(來自mvc控件工具包)提供。因此,我需要使其可序列化。 – Patrick 2012-02-03 14:18:17

+0

@Patrick如果你有一些東西在DTO中是不可序列化的,那麼它不是DTO – 2012-02-03 14:40:22

+0

問題是mvc控件工具包給了一個跟蹤器對象來跟蹤網格中的變化。例如,這將是一個 列表 >>。我下載了工具包的源代碼並自己添加了序列化。此外,我請維護人員將其添加到工具包中,他會這樣做。 – Patrick 2012-02-03 18:07:48

0

如果類型是公開的,你應該可以使用XmlSerializer來做你想做的事。

more information on this here

序列化和反序列化對象的進入和從XML文檔。使用XmlSerializer可以控制對象如何編碼爲XML。

+0

它並沒有提供太多的靈活性...... – 2012-02-03 13:26:40

0

準確地把你的子類,並使其可序列化。

[Serializable] public class Foo: Bar {} 
+0

如果使用XmlSerializer,請不要忘記構造函數。 – Candide 2012-02-03 13:23:38

+0

@Ingenu,構造函數有什麼特別之處? – 2012-02-03 13:26:40

+2

@BuhBuh它需要有一個公共無參數構造函數供'XmlSerializer'使用;然而,應該注意''[Serializable]'涉及'BinaryFormatter',而不是'XmlSerializer'。 – 2012-02-03 13:35:19

0

編寫一個適配器或準備做一些更極端的事情,比如反彙編程序集,注入可序列化的屬性並重裝。

+0

O_o。這是一個非常極端的例子。如果你的目標類是密封的,你沒有創建重複dto的權限,無法將其序列化爲二進制,XML,JSON或CSV,而其他一些不可破解的力量隱藏你在代碼中完成序列化,只有在組裝並在IL中進行修改。 – Oybek 2012-02-03 14:38:00

相關問題