在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