通常 ASP.NET 儲存會話狀態有三種方式——InProc、StateServer 和 SQLServer。最常用的是第一種,此情況下可用類似語法儲存會話狀態:Session["key"] = val。其中 val 可為任何型別物件。
但若使用 StateServer 或 SQLServer,則要求 val 型別必須可序列化,因 ASP.NET 應用程式與狀態伺服器交換資料時需對物件序列化。若 val 不可序列化(有私有欄位/屬性且未指定自訂序列化特性),執行時會出現異常:
「/」應用程式中的伺服器錯誤。
無法序列化會話狀態。在「StateServer」或「SQLServer」模式下,ASP.NET 將序列化會話狀態物件,因此不允許使用無法序列化的物件或 MarshalByRef 物件。若自訂會話狀態儲存在「Custom」模式下執行類似序列化,同樣限制適用。
解決方法有幾種:
幾種方法優劣暫不說明。我偷懶用了第一種。