我在以下声明中收到错误:
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"]);
请在此澄清我..
答案 0 :(得分:2)
因为在ViewState中存储项目的结果是那些存储在页面上的字符串中(为了维护多个请求之间的状态),它们需要是可序列化的,另一方面,Session在内存存储中(如果你正在使用) InProc模式,默认情况下,否则不适用),因此对象不需要可序列化。
另外,请参阅此答案以澄清: Why Viewstate can contain only serializable object?
希望这有帮助。
答案 1 :(得分:1)
Viewstate
只能包含可序列化的对象,而Session
不需要可序列化的对象。这就是为什么你的代码适用于Session而不适用于viewstate的原因。
此外,you can't store an object in viewstate unless it's marked as serializable.
Viewstate始终作为序列化对象传递回浏览器。因此,只能在其中放置可序列化的对象。如果你没有在其中放置可序列化的对象,它就不能代表它包含的内容。
答案 2 :(得分:0)
ViewState:
ViewState中的序列化和反序列化依赖于ObjectStateFormatter,并且不支持List(通用列表)类型。所以你会收到错误。
要解决此问题,您需要处理自己的序列化。您可以使用 [Serializable] 属性来使其正常工作。 See this post in stackoverflow。在您的情况下,您需要创建继承自ListItem对象的自定义类并应用 [Serializable] 属性。