共用方式為


序列化方針

您應該在設計新類別時考慮序列化,因為類別無法在編譯之後變成可序列化。該疑惑的問題是:這個類別需不需要跨應用程式定義域傳送?這個類別到底要不要和遠端處理一起使用?使用者將如何使用此類別 - 他們會不會從我需要序列化的類別衍生新類別?若有疑問時,就將類別標記為可序列化。最好能將所有的類別標記為可序列化,除非符合下列任何條件:

  • 類別將永遠不會跨應用程式定義域。如果無需序列化而且類別需要跨應用程式定義域,便從 MarshalByRefObject 來衍生類別。
  • 類別儲存只適用於類別目前執行個體的特殊指標。例如,如果類別包含 Unmanaged 記憶體或檔案控制代碼 (File Handle) 的話,便要確保這些檔案會標記為 NonSerialized,或完全不會將類別序列化。
  • 類別資料成員包含敏感資訊。在這種情況下,建議將類別標記為可序列化,但將包含敏感資訊的個別資料成員標記為 NonSerialized。另一個替代方式為實作 ISerializable 介面,並且僅序列化必要的欄位。

請留意將類別標記為可序列化的安全性含意。依預設,可以略過類別或類別建構函式上 CodeAccessPermission連結需求繼承需求,或是實作相同 CodeAccessPermission 的對應需求之自訂序列化。如果類別有使用權限的連結需求,Runtime 只會檢查直接呼叫端以驗證呼叫端是否被授與使用權限。.NET Framework 類別庫程式碼使用 Microsoft 強式名稱簽名,並永遠被授與完全的信任。任何程式碼都可以使用授與完全信任的程式碼來略過連結時間的安全性檢查。例如,在序列化的情況下,沒有必要序列化使用權限的惡意程式碼可以呼叫其中一個完全受信任的 .NET Framework 格式子 (如 BinaryFormatter) 並略過使用權限的連結需求檢查。

請參閱

二進位序列化 | 使用 .NET 遠端處理存取其他應用程式定義域中的物件 | XML 和 SOAP 序列化 | 安全性和序列化