2008-10-28 116 views
1

如你所知,在ASP.NET中,可以存儲會話數據在以下三種模式之一:ASP.NET會話狀態服務器 - 保存序列化的數據

  • 是InProc
  • 會話狀態
  • SQL服務器

對於InProc模式,您可以存儲任何種類的數據對象,即使它不是可序列化的。但是,在會話狀態和SQL Server模式下,只能存儲序列化的數據。

在我的項目中,我有一個使用「InProc」模式存儲會話的現成門戶。由於某些可伸縮性和故障處理問題,我需要使用會話狀態。

此門戶內部存儲會將未反序列化的對象存儲在會話上下文中(即存儲的對象不實現ISerializable接口)的問題。我無法訪問他們的代碼。是否有任何解決方法,以便我可以將會話對象存儲在狀態服務器中而不更改其代碼。如果這有助於任何形式的話,我仍然可以訪問他們的web.config文件。

回答

1

AFAIK,簡單的答案是否定的。如果你不介意改變你的代碼,你可以在實際對象和你的對象之間注入一個包裝對象,並讓你的包裝處理序列化包裝對象(本質上作爲序列化代理) - 但到那時,它幾乎會更容易只需重新編寫代碼...

它們是什麼樣的對象?通常,會話狀態的對象應該是簡單的數據類,所以序列化它們不應該有太多問題?

+0

實際上,我們無法訪問代碼,因爲它是第三方.NET門戶。我們只能在web.config中進行更改。 關於你的評論,我們可以包含一個包裝作爲外部程序集/ DLL,並對web.config進行更改,以便將此包裝用於對象會話存儲? – mohammedn 2008-10-28 12:51:10

+0

不是我所知道的;你將不得不改變頁面代碼。所以,如果你沒有訪問權限,你有點困惑。 – 2008-10-28 13:22:37

1

序列化創建可以存儲和讀取的對象的表示形式,以重新創建對象的狀態。

如果一個對象只包含值類型,那麼你可能不需要實現ISerializable,但只需要[Serializable]屬性。

做出這種回答更多的幫助或直接的問題在手:

您不能連載已經不以某種方式爲可序列被delcared的對象。任何其他通用的重新創建對象的方式都可能導致對象與「串行化」之前的狀態不同。如Marc所說,你可以通過創建你自己的可序列化的'wrapper'來實現,但你需要對所討論的對象非常熟悉,並且對象需要有方法來允許它成爲以這種方式重新創建。