1

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

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

请澄清我这个..

4

3 回答 3

2

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

另外请参阅此答案以进行澄清: 为什么 Viewstate 只能包含可序列化对象?

希望这可以帮助。

于 2013-10-03T13:13:27.467 回答
1

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

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

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

于 2013-10-03T13:18:48.987 回答
0

视图状态:

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

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

会话: 请参阅stackoverflow中的这篇文章

于 2013-10-03T13:33:05.690 回答