【问题标题】:Difference between View State and Session usage视图状态和会话使用之间的区别
【发布时间】:2013-10-03 13:09:33
【问题描述】:

我在以下语句中遇到错误:

liPages = (List<ListItem>)(ViewState["CurrentSetOfPages"]);

我得到的错误是:

Type 'System.Web.UI.WebControls.ListItem' in Assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

但是,当我使用以下各项时,一切似乎都很完美..

liPages = (List<ListItem>)(Session["CurrentSetOfPages"]);

请澄清一下..

【问题讨论】:

标签: c# asp.net session viewstate


【解决方案1】:

由于在 ViewState 中存储项目的结果是这些项目存储在页面上的字符串中(以维护多个请求之间的状态),因此它们需要可序列化,另一方面 Session 在内存存储中(如果您正在使用InProc 模式,这是默认的,否则不适用),所以对象不需要是可序列化的。

另外请参阅此答案以进行澄清: Why Viewstate can contain only serializable object?

希望这会有所帮助。

【讨论】:

  • 只有在使用SessionStateMode.InProc 时对象不需要为会话存储序列化。所有其他模式都需要对象来实现 I 可序列化。
【解决方案2】:

Viewstate 只能包含可序列化对象,而Session 不需要可序列化对象。这就是为什么您的代码适用于 Session 而不是 viewstate。

另外,you can't store an object in viewstate unless it's marked as serializable.

Viewstate 总是作为序列化对象传递回浏览器。因此,只能在其中放置可序列化的对象。如果你不把可序​​列化的对象放进去,它就不能代表它所包含的内容。

【讨论】:

    【解决方案3】:

    视图状态:

    ViewState 中的序列化和反序列化依赖于ObjectStateFormatter,并且它不支持 List(通用列表)类型。所以你会得到错误。

    要解决此问题,您需要处理自己的序列化。您可以使用 [Serializable] 属性使其工作。 See this post in stackoverflow。在您的情况下,您需要创建从 ListItem 对象继承的自定义类并应用 [Serializable] 属性。

    会话: Please see this post in stackoverflow

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多