【问题标题】:Are Linq to sql objects serializable for session state?Linq to sql 对象是否可序列化以用于会话状态?
【发布时间】:2009-10-29 13:37:19
【问题描述】:

不考虑这是个好主意还是坏主意:

当会话进程外时,是否可以在 ASP.NET 会话中存储 LINQ-to-SQL 域对象?

[编辑] 我目前收到以下错误并问了这个问题,因为我怀疑 LINQ-to-SQL 对象:

无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。 [/编辑]

例如

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

地点:

  • Zoo、Lion、Tiger、Elephant 都来自 ZooDataContext

并且 web.config 文件包含

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

【问题讨论】:

    标签: asp.net linq-to-sql serialization session-state


    【解决方案1】:

    要使用二进制格式化程序(我相信像 SessionState 一样使用), 您需要自己从 DBML 生成代码(我目前使用 Linq2Sql T4 模板来生成代码)。

    以下需要标记为[NonSerialized]

    • EntityRef
    • EntitySet
    • 所有事件(您需要跳出框框思考才能做到这一点,读者练习)

    还需要将构造函数逻辑移至OnCreated。您还必须确保在反序列化时调用OnCreated,以便该对象可以再次有用。这是通过[OnDeserializing] 属性完成的。

    【讨论】:

      【解决方案2】:

      在存储到会话或任何其他可能想要序列化的东西之前使用 datacontractserializer 对它们进行序列化...Recently discussed here:

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

      【讨论】:

      • 感谢您给我这个想法。我曾假设如果这些类是可序列化的,那么它们就是 serializable 的,就像在 XmlSerializer 中一样。最后,我将 XmlTextWriter 包裹在 MemoryStream 周围,然后使用 DataContractSerializer 序列化到 XmlTextWriter。之后,内存流的 byte[] 缓冲区可以被序列化并在进程外存储。我真的不喜欢这种拼凑的修复,但我被其他人设计的依赖状态而不是“重放”模式的设计逼到了角落。
      【解决方案3】:

      我相信您需要将您的对象标记为可序列化。我不确定是否有办法对所有生成的对象执行此操作,但是对于您要放入会话的对象,您可以创建一个部分类(例如 Lion)并为其赋予 Serializable 属性。

      【讨论】:

      • 谢谢。这似乎是一个很有前途的想法,但不幸的是它不起作用。在某种程度上,我很高兴 :) 因为对于一个有很多类的大型模型来说,这也是一个真正的痛苦。这篇文章让我很恼火:“如何:使实体可序列化(LINQ to SQL)”msdn.microsoft.com/en-us/library/bb546185.aspx 暗示它们应该是可序列化的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2014-11-05
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多