通常,ASP.NET存儲會話狀態有三種方式——InProc、StateServer和SQLServer。一般最常用的是第一種,在這種情況下,可以用類似這樣的語法來存儲會話狀態:Session["key"] = val。其中val可以使任何類型的對象。
但如果使用StateServer或SQLServer,則要求val的類型必須是一個可序列化類型,因為ASP.NET應用在於狀態服務器之間交換數據時,需要對對象進行序列化。如果val不可序列化(有私有域/屬性並且沒有指定自定義序列化特性),則會在運行時出現如下異常:
“/”應用程序中的服務器錯誤。
--------------------------------------------------------------------------------
無法序列化會話狀態。在“StateServer”或“SQLServer”模式下,ASP.NET 將序列化會話狀態對象,因此不允許使用無法序列化的對象或 MarshalByRef 對象。如果自定義會話狀態存儲在“Custom”模式下執行了類似的序列化,則適用同樣的限制。
解決方法有這樣幾種:
1 盡量使用基本類型的對象來存放數據
2 自定義類型只使用公有域/屬性
3 為自定義類型實現序列化特性
……
幾種方法優劣暫不作說明。我偷懶用了第一種。