2010-06-05 89 views
33

基於我的理解,SerializableAttribute不提供編譯時檢查,因爲它全部在運行時完成。如果是這樣的話,爲什麼需要將類標記爲可序列化?爲什麼序列化對象需要序列化

序列化程序不能嘗試序列化一個對象,然後失敗嗎?這不正是它現在所做的嗎?當某些東西被標記時,它會嘗試並失敗。如果你必須將事物標記爲不可序列化而不是可序列化,這會不會更好?這樣你就不會有庫不把事情標記爲可序列化的問題了?

+0

可能重複[爲什麼你必須標記與屬性的類\ [序列化\]](http://stackoverflow.com/問題/ 2595104 /爲什麼-DO-你具備對標記A級與 - 該屬性可序列化) – nawfal 2014-07-10 09:57:06

+0

你可以嘗試自動添加屬性使用[postsharp(HTTPS所有的類:// www.postsharp.net/)。類似的應用顯示在這個問題:http://stackoverflow.com/questions/7851365/how-to-inject-an-attribute-using-a-postsharp-attribute – 2016-02-17 17:51:37

回答

34

據我所知,SerializableAttribute背後的想法是爲二進制序列化創建一個選擇加入系統。

請記住,與使用公共屬性的XML序列化不同,二進制序列化在默認情況下捕獲所有私有字段。

這不僅可能包括操作系統結構和私有數據是不應該被曝光,但反序列化就可能造成損壞的狀態可能會崩潰的應用程序(傻例如:文件句柄在開放不同的電腦)。

+1

+1 - 基本上非公安曝光信息是這裏的問題。 – TomTom 2010-06-06 07:26:32

+0

只有答案解釋了爲什麼二進制序列化需要它。幹得好,在所有的答案中都錯過了這一點。 – 2014-10-26 11:22:00

19

這只是BinaryFormatter(和SOAP等價物,但沒有人使用)的要求。迭戈是對的;也有在做什麼的條件很好的理由,但它是遠不是唯一的選擇 - 事實上,我個人只建議BinaryFormatterAppDomains之間的談話 - 這是(IMO)的好辦法堅持數據(磁盤,緩存,數據庫BLOB等)。

如果此行爲會導致你的麻煩,可以考慮使用任何替代品:

  • XmlSerializer,這對公衆成員(不僅僅是場)工作,但需要一個公共的無參數的構造函數和公共型
  • DataContractSerializer,其可以工作完全選擇加入(使用[DataContract]/[DataMember]),但其也可以(在3.5以上)針對的字段工作代替

另外 - 對於第三方選項(我是第三方); protobuf-net在這裏可能有選擇; 「v2」(尚未完全發佈,但作爲源可用)允許模型(哪些成員序列化等)獨立於類型進行描述,以便它可以應用於您無法控制的類型。不像BinaryFormatter的輸出版本寬容,已知的公共格式等

+0

真棒。精彩的總結您在c#中使用它們的優點和缺點進行序列化的選擇。正是我最近一週期待的...... Merci Marc。 – Arthis 2012-06-29 12:57:42

相關問題