经常使用 Session 直接储存一些字符串和值类型,但很少储存对象,在取 Session 值时将指定 Session 进行强制类型转换以获取储存在 Session 中的值,于是想当然的认为 Session 储存对象类似于 ViewState,是将对象串行化以后放入到 Session 中的。 日前在做一个流程处理的时候,将流程处理的过程封装成了一个独立的类,与页面分离开来,因为要跨页面保存该对象的状态信息,所以将对象存储到 Session 中,却发现 Session 储存对象时似乎不是串行化以后再保存,而是直接储存对象的一个引用,为证实这个结论,做了一个小测试:
- //自定义对象
- public class SessionTest
- {
- public int a = 1;
- public SessionTest()
- {
- //
- // TODO: Add constructor logic here
- //
- }
- }
页面代码:
- public partial class SessionTestPage : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- SessionTest st = new SessionTest();
- lt1.Text = st.a.ToString();
- Session["Ss"] = st;
- //储存到 Session 后更改对象值
- st.a = 2;
- }
- }
- protected void btnSubmit_Click(object sender, EventArgs e)
- {
- SessionTest st2 = Session["Ss"] as SessionTest;
- //从 Session 中取出对象并显示
- lt2.Text = st2.a.ToString();
- }
- }
在页面上显示 lt2.Text 的值为 2,这个值是在对象储存到 Session 后才改变的,这表明 Session 储存的是对象的引用。这帮了我一个很大的忙,只要在创建对象后将对象储存到 Session,然后对象的更改会在 Session 中实时反应出来,而不用担心 Session 和 对象的同步。
注意:仅测试了状态管理为 Inproc 时的情形。