在ASP.NET1.1中,为了提高性能,相信很多程序员都会关闭页面中的ViewState,但是ViewState的好处也是不言而喻的。好在ASP.NET2.0对ViewState的性能有了很大的改进。下面让我们做一个简单的实验,同时在ASP.NET1.1页面和ASP.NET2.0页面中只放一个Calendar控件。页面加载后比较ViewState的值:
ASP.NET1.1:
dDwtMTg1NDkwMjc0Nzs7Pl12VFm8r/3KAR2G8pAi4CBwTh7U
ASP.NET2.0:
/wEPDwULLTEzNjg5MjAxMzhkZM3POpW3dbRaQefygzI077pRcrTT
怎么ASP.NET2.0比ASP.NET1.1的还长呢?别急,看看Postback之后的值变化:
ASP.NET1.1:
dDwtMTg1NDkwMjc0Nzt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxPjs+
O2w8dDxAMDxwPHA8bDxTRDs+O2w8bDxTeXN0ZW0uRGF0ZVR
pbWUsIG1zY29ybGliLCBWZXJzaW9uPTEuMC41MDAwLjAsIEN
1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVj
NTYxOTM0ZTA4OTwyMDA2LTA3LTEzPjs+Oz4+Oz47Ozs7Ozs7
Ozs7Pjs7Pjs+Pjs+Pjs+9eOkIaZE+12gW74Bc8StBZYa2k4=
ASP.NET2.0:
/wEPDwULLTEzNjg5MjAxMzgPZBYCAgMPZBYCAgEPPCsACgEADx
YCHgJTRBYBBgCAlGndeMgIZGRkk9cH1OOEfjnO+6Uh0IKI2SfSHcU=
很明显2.0中的ViewState值比1.0中缩减了不少,这样的话对性能会有一个很大的提升。原因很简单,在1.1中使用LosFormatter序列化ViewState数据,而2.0中使用了一个专门的类ObjectStateFormatter序列化和反序列化ViewState数据。LosFormatter是使用TextWriter的,而ObjectStateFormatter是使用BinaryWriter的,这就使得2.0中用bytes保持ViewState而不是像1.1中使用string保持。举一个例子:一个整型变量在1.1中需要4个bytes的ViewState数据,而在2.0中只要1个byte。
关于ObjectStateFormatter参考:
http://msdn2.microsoft.com/zh-cn/library/system.web.ui.objectstateformatter.aspx