在Web專案開發時,有時我們會需要將某些值,以利往後的Postback可以在調用或變更。
通常會使用Web的變數,例如:Application、Session、Cookie、Cache、ViewState等....
本筆記所採用的是ViewState來記錄所需的資料~
C# Code:
定義一個自訂類別:
public class En { private string id; public string Id { get { return id; } set { id = value; } } private string name; public string Name { get { return name; } set { name = value; } } }
宣告一個全域的自訂型別 En 的屬性,Get、Set機制都會存取ViewState
aspx.cs Code:
public partial class ViewState_Use_Object_Default : System.Web.UI.Page {
private En iv_e; public En V_en { get { iv_e = (En)ViewState["en"]; return iv_e; } set { iv_e = value; ViewState["en"] = iv_e; } } protected void Page_Load(object sender, EventArgs e) {
//一開始就存取V_en這個屬性 if (!IsPostBack) { En x = new En(); x.Id = "001"; x.Name = "Ray"; this.V_en = x; } }
protected void Button1_Click(object sender, EventArgs e) { En x = this.V_en; txtID.Text = x.Id; txtName.Text = x.Name; }
}
程式一Run起來,就出現SerializationException ~ !! 如下圖
未將型別 'En' (省略......) 標記為可序列化。
原因是因為ViewState機制
基本上是靠著將資料編碼成Base64,
且把值放在網頁中的一個隱藏欄位如下例子:
<input type="hidden" name="__VIEWSTATE"
id="__VIEWSTATE"
value="/wEPDwUKMTkwNjc4NTIwMWRkyv4ncofW5vaWXdXRtXfXn3RYQR4=" />
如此當自訂類別之物件要去存取ViewState時,
就會發生序列化的問題!
ps: 序列化是將資訊轉換成,可被儲存或傳送位元資料流的一種過程,
舉Java深入淺出書中提到的概念,
物件就好像是一個泳圈(飽滿的),
序列化就是把泳圈的氣給消掉,只剩下泳圈的外層,藉以傳遞物件,
反序列化就把原來的泳圈再充飽氣!
so....這時,我們自訂的類別則需要做一些調整
將自訂類別標是為可序列化如下程式碼
C#:
[Serializable] public class En()
VB :
<Serializable()> _
public class En()
以下程式碼省略..................
再執行程式,就可以順利運作了! 以上提供參考
全站熱搜