基於我的理解,SerializableAttribute不提供編譯時檢查,因爲它全部在運行時完成。如果是這樣的話,爲什麼需要將類標記爲可序列化?爲什麼序列化對象需要序列化
序列化程序不能嘗試序列化一個對象,然後失敗嗎?這不正是它現在所做的嗎?當某些東西被標記時,它會嘗試並失敗。如果你必須將事物標記爲不可序列化而不是可序列化,這會不會更好?這樣你就不會有庫不把事情標記爲可序列化的問題了?
基於我的理解,SerializableAttribute不提供編譯時檢查,因爲它全部在運行時完成。如果是這樣的話,爲什麼需要將類標記爲可序列化?爲什麼序列化對象需要序列化
序列化程序不能嘗試序列化一個對象,然後失敗嗎?這不正是它現在所做的嗎?當某些東西被標記時,它會嘗試並失敗。如果你必須將事物標記爲不可序列化而不是可序列化,這會不會更好?這樣你就不會有庫不把事情標記爲可序列化的問題了?
據我所知,SerializableAttribute
背後的想法是爲二進制序列化創建一個選擇加入系統。
請記住,與使用公共屬性的XML序列化不同,二進制序列化在默認情況下捕獲所有私有字段。
這不僅可能包括操作系統結構和私有數據是不應該被曝光,但反序列化就可能造成損壞的狀態可能會崩潰的應用程序(傻例如:文件句柄在開放不同的電腦)。
+1 - 基本上非公安曝光信息是這裏的問題。 – TomTom 2010-06-06 07:26:32
只有答案解釋了爲什麼二進制序列化需要它。幹得好,在所有的答案中都錯過了這一點。 – 2014-10-26 11:22:00
這只是BinaryFormatter
(和SOAP等價物,但沒有人使用)的要求。迭戈是對的;也有在做什麼的條件很好的理由,但它是遠不是唯一的選擇 - 事實上,我個人只建議BinaryFormatter
爲AppDomains
之間的談話 - 這是不(IMO)的好辦法堅持數據(磁盤,緩存,數據庫BLOB等)。
如果此行爲會導致你的麻煩,可以考慮使用任何替代品:
XmlSerializer
,這對公衆成員(不僅僅是場)工作,但需要一個公共的無參數的構造函數和公共型DataContractSerializer
,其可以工作完全選擇加入(使用[DataContract]
/[DataMember]
),但其也可以(在3.5以上)針對的字段工作代替另外 - 對於第三方選項(我是第三方); protobuf-net在這裏可能有選擇; 「v2」(尚未完全發佈,但作爲源可用)允許模型(哪些成員序列化等)獨立於類型進行描述,以便它可以應用於您無法控制的類型。不像BinaryFormatter的輸出版本寬容,已知的公共格式等
的真棒。精彩的總結您在c#中使用它們的優點和缺點進行序列化的選擇。正是我最近一週期待的...... Merci Marc。 – Arthis 2012-06-29 12:57:42
可能重複[爲什麼你必須標記與屬性的類\ [序列化\]](http://stackoverflow.com/問題/ 2595104 /爲什麼-DO-你具備對標記A級與 - 該屬性可序列化) – nawfal 2014-07-10 09:57:06
你可以嘗試自動添加屬性使用[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