在我自己的對象上,我可以添加元標記[Serializable]使其可序列化。現在我使用第三方庫,我需要序列化。我檢查了代碼,它不應該是一個問題。有沒有辦法解決這個問題,而不改變第三方代碼?c#:使第三方對象可序列化
回答
我的建議是:序列數據,不實現。存在第三方對象的事實與數據無關;那是一個實現細節。因此,我總是提供相同的建議:如果系列化有史以來變得複雜,首先要做的是引入一個單獨的DTO模型,代表數據孤立的實現,並只是將當前狀態映射到DTO。這允許您處理實現更改而不影響存儲,並允許序列化不可序列化的對象。
一些序列化器提供瞭解決方法 - 例如protobuf-net,您可以:a在運行時爲任何類型提供序列化信息,b:提供一個「代理」以便在棘手時自動使用,但是 - 使用DTO型號更簡單,更易於維護。
您使用[Serializable]
建議BinaryFormatter
;在我看來,這是幾乎從來沒有任何類型的存儲的好選擇,因爲BinaryFormatter
依賴於實現細節。它很適合在兩個同步應用程序域之間傳遞數據,但
如果類型是公開的,你應該可以使用XmlSerializer
來做你想做的事。
有more information on this here
序列化和反序列化對象的進入和從XML文檔。使用XmlSerializer可以控制對象如何編碼爲XML。
它並沒有提供太多的靈活性...... – 2012-02-03 13:26:40
準確地把你的子類,並使其可序列化。
[Serializable] public class Foo: Bar {}
如果使用XmlSerializer,請不要忘記構造函數。 – Candide 2012-02-03 13:23:38
@Ingenu,構造函數有什麼特別之處? – 2012-02-03 13:26:40
@BuhBuh它需要有一個公共無參數構造函數供'XmlSerializer'使用;然而,應該注意''[Serializable]'涉及'BinaryFormatter',而不是'XmlSerializer'。 – 2012-02-03 13:35:19
編寫一個適配器或準備做一些更極端的事情,比如反彙編程序集,注入可序列化的屬性並重裝。
O_o。這是一個非常極端的例子。如果你的目標類是密封的,你沒有創建重複dto的權限,無法將其序列化爲二進制,XML,JSON或CSV,而其他一些不可破解的力量隱藏你在代碼中完成序列化,只有在組裝並在IL中進行修改。 – Oybek 2012-02-03 14:38:00
- 1. MsgPack第三方對象序列化
- 2. 如何使用Jackson序列化/反序列化第三方Java對象
- 3. 在Spark流轉換中使用第三方不可序列化對象
- 4. Java:如何序列化第三方庫生成的Java對象?
- 5. ValueProxy自動序列化第三方對象
- 6. 使用C#序列化Java可反序列化的對象
- 7. 如何使用與Spark不可序列化的第三方庫
- 8. 設置從第三方對象序列化的JSON屬性的順序
- 9. C#可序列化動態對象
- 10. 非序列化第三方類的Java序列化
- 11. C#反序列化對象
- 12. C++對象序列化
- 13. 序列化C++對象
- 14. Java可序列化對象
- 15. 對象不可序列化
- 16. 如何序列化對象+壓縮它,然後解壓縮+反序列化沒有第三方庫?
- 17. 使用不可序列化對象序列化hashmap
- 18. Java-使用Xstream序列化不可序列化的對象
- 19. 使用SWTBot自動化第三方應用程序。可能嗎?
- 20. 可能序列化一個不可序列化的對象?
- 21. 可序列化對象的組合是否也可序列化?
- 22. Protobuf-net:使用Stream數據成員對第三方類進行序列化
- 23. 谷歌Aalytics第三方可視化
- 24. .NET:將對象序列化爲來自第三方程序集的文件(以使Selenium WebDriver更快)
- 25. JAVA:是否有可能序列化與私有字段不可序列化的第三方類?
- 26. Json.NET自定義序列化/第三方類型的反序列化
- 27. c#第三方skype
- 28. JavaScript有第三方對象加載
- 29. 在二進制序列化(C#)中如何跳過可序列化對象中的不可序列化字段?
- 30. 在調試器中格式化第三方.NET對象
你不能只是子類嗎? – vulkanino 2012-02-03 13:18:40
這很大程度上取決於:哪個序列化程序(是否是BinaryFormatter?),以及b:類型是什麼樣的;個人而言,我只是使用單獨的數據模型。 – 2012-02-03 13:27:16