视图状态和会话使用情况之间的差异

本文关键字:之间 情况 用情 会话 视图状态 | 更新日期: 2023-09-27 18:33:49

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

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"]);

请澄清我这一点..

视图状态和会话使用情况之间的差异

由于在 ViewState 中存储项目

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

此外,请参阅此答案以进行澄清:为什么视图状态只能包含可序列化的对象?

希望这有帮助。

>Viewstate只能包含可序列化的对象,而Session不需要可序列化的对象。这就是为什么您的代码适用于会话而不是视图状态。

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

视图状态始终作为序列化对象传递回浏览器。因此,只能在其中放置可序列化的对象。如果不在其中放置可序列化的对象,则它无法表示它包含的内容。

ViewState :

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

要解决此问题,您需要处理自己的序列化。您可以使用 [可序列化] 属性使其正常工作。请参阅堆栈溢出中的这篇文章。在这种情况下,您需要创建从 ListItem 对象继承的自定义类并应用 [可序列化] 属性。

会话:请参阅堆栈溢出中的这篇文章

相关文章: