2009-10-20 72 views
2

我用的是XML序列化,但是當我切換到二進制序列,它拋出一個異常:爲什麼二進制序列化要求將對象標記爲可序列化?

Runtime error: dotNet runtime exception: Type 'MyTypes.MyObject' in Assembly 'MyTypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

爲什麼比它要求這種方式的XML序列化有什麼不同?

只是標記對象序列化是足以解決這個問題?我不想指定序列化應該如何發生。

回答

9

XmlSerializer是安全的在所有情況下使用,因爲它只序列公開訪問的數據,表明該類的用戶可以訪問反正。

任何運行時格式化程序(包括BinaryFormatter)都會序列化公開和私下可訪問的信息,因此可能會使調用者訪問他們不應該擁有的信息。標記您的類型爲[Serializable]你實際上是說,你已經想到這一點,並授予權限給任何人看你的類型的序列化信息。

這是一個「安全默認」的選擇,這樣你就不會意外地結束了序列化,如信用卡的詳細信息或任何地方進入他們不應該是這樣的,記錄或數據庫中的敏感數據。

2

BinaryFormatter和xml序列化程序(除了明顯的輸出格式)之間的根本區別在於二進制序列化保留了類型信息(私有/公共屬性,方法,事件等)。這是這種類型的序列化與遠程處理一起使用的原因之一。唯一的要求是用SerializableAttribute來修飾類型。