在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()

 

以下程式碼省略..................

  
再執行程式,就可以順利運作了! 以上提供參考
arrow
arrow
    全站熱搜

    Ryan 發表在 痞客邦 留言(0) 人氣()