2009-10-29 67 views
4

沒有進入這是否是好還是壞主意:Linq是否可以序列化爲會話狀態的sql對象?

是否有可能存儲在ASP.NET會話,LINQ到SQL域對象在會話外的過程

[編輯] 我目前收到以下錯誤,問這個問題,因爲我懷疑LINQ到SQL對象:

無法序列化會話狀態。在'StateServer'和'SQLServer'模式下,ASP.NET將序列化會話狀態對象,因此不允許使用不可序列化的對象或MarshalByRef對象。如果自定義會話狀態存儲在「自定義」模式下進行類似的序列化,則適用相同的限制。 [/編輯]

例如,

Session["Zoo"] = new Zoo() { 
         new Lion(), 
         new Tiger(), 
         new Elephant() 
        } 

其中:

  • 動物園,獅子,老虎,大象都配備一個ZooDataContext

和web.config文件中包含了

<sessionState 
     mode="StateServer" 
     stateConnectionString="tcpip=127.0.0.1:42424" 
     stateNetworkTimeout="10" 
     sqlConnectionString="SqlStateConnectionString" 
     sqlCommandTimeout="30" 
     timeout="20" 
     regenerateExpiredSessionId="true"/> 

回答

1

使用DataContractSerializer的會話或其他任何可能要序列存儲序列化之前他們... Recently discussed here

http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/81c84ff4-059b-474f-9c69-b8c59027fd48

+0

謝謝你給我的想法。我曾假設如果這些類是可序列化的,那麼它們就是* serializable *,就像XmlSerializer會工作一樣。最後,我圍繞一個MemoryStream封裝了XmlTextWriter,然後使用DataContractSerializer將其串入到XmlTextWriter中。之後,內存流的byte []緩衝區可以被序列化並存儲在進程外。我真的不喜歡這個修補程序,但是我依靠某些依賴狀態而不是「重放」模式的else設計​​支持角落。 – 2009-10-29 22:50:43

1

我會相信你需要將你的對象標記爲可序列化。我不確定是否有辦法爲所有生成的對象執行此操作,但對於那些正在進入會話的對象,您可以創建一個部分類(例如Lion)併爲其指定Serializable屬性。

+0

謝謝。這似乎是一個有前途的想法,但不幸的是它不起作用。在某種程度上,我很高興:)因爲這對於有很多類的大型模型來說也是一個真正的痛苦。這是嘮叨我的文章:「如何:使實體序列化(LINQ to SQL)」http://msdn.microsoft.com/en-us/library/bb546185.aspx意味着它們應該是可串行化的。 – 2009-10-29 22:42:11

4

要使用二進制格式(如SessionState的使用,我相信), 你需要從DBML中自己生成你的代碼(我現在用Linq2Sql T4模板來完成)。

下需要被標記爲[NonSerialized]

  • EntityRef
  • EntitySet
  • 所有事件(你需要條條框框要做到這一點,練習閱讀器)

另外構造函數邏輯需要移動到OnCreated。反序列化時,您還必須確保調用OnCreated,以便對象再次有用。這是通過[OnDeserializing]屬性完成的。

相關問題