为什么Viewstate只能包含可序列化对象?

5

我有一个简单的类,其中包含一些属性和其他数据。如果我不使用Serializable属性将其附加到该类,则无法将该类的对象保存到ViewState中。

为什么ViewState只能包含可序列化的对象?


(默认的)ASP.NET序列化就是这样工作的。还有其他的序列化识别技术(例如DataContracts),但只有Serializable注释类型被LosFormatter(旧版)和ObjectStateFormatter支持。(虽然,ISerializable也可能有效,但我从未尝试过。) - user166390
4个回答

6
作为请求的ViewState以序列化表示形式嵌入在生成的页面的HTML中传回浏览器,因此只有可序列化的对象可以放置在其中(否则可能无法表示其所包含的内容)。然后,在下一个请求期间对该ViewState进行反序列化。

http://i.msdn.microsoft.com/dynimg/IC152667.gif gives an example of the typical

如果您正在使用POCO,将它们标记为可序列化应该很容易。这里有一份关于理解视图状态的优秀资源,介绍了它是什么等等。

http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx

本文将全面介绍状态的完整生命周期,并从开发人员的角度详细介绍其实现和使用。


2
因为ViewState在发送到客户端之前被序列化,所以可能会泄露敏感信息。也许您可以将数据存储在Session对象中,具体取决于您的类执行的操作和使用方式。

1
+1,但是一些会话状态模式(状态服务器、SQL服务器)也要求对象可序列化。 - davidsleeps

2

之所以需要存储在视图状态中的数据进行序列化(和反序列化),是因为视图状态本质上只是文本,因此存储在其中的任何内容都需要能够表示为文本,并且能够从序列化的文本中重构为对象形式。

因此,视图状态中存储的数据需要进行序列化,以便在页面回发时能够正确地恢复状态。


1
我认为这个总结回答了问题: 状态从Asp.Net代码到HTTP处理程序失控,处理程序不理解您的代码,而您的代码将超出范围,并必须将其序列化在数据存储中(当您查看asp.net页面源代码时看到的大量垃圾),然后在另一个postback需要时返回它。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接