Session如何存储对象?

经常使用 Session 直接储存一些字符串和值类型,但很少储存对象,在取 Session 值时将指定 Session 进行强制类型转换以获取储存在 Session 中的值,于是想当然的认为 Session 储存对象类似于 ViewState,是将对象串行化以后放入到 Session 中的。 日前在做一个流程处理的时候,将流程处理的过程封装成了一个独立的类,与页面分离开来,因为要跨页面保存该对象的状态信息,所以将对象存储到 Session 中,却发现 Session 储存对象时似乎不是串行化以后再保存,而是直接储存对象的一个引用,为证实这个结论,做了一个小测试:

  1. //自定义对象
  2. public class SessionTest
  3. {
  4.     public int a = 1;
  5.     
  6.     public SessionTest()
  7.     {
  8.         //
  9.         // TODO: Add constructor logic here
  10.         //      
  11.     }
  12. }

页面代码:

  1. public partial class SessionTestPage : System.Web.UI.Page
  2. {
  3.     protected void Page_Load(object sender, EventArgs e)
  4.     {
  5.         if (!IsPostBack)
  6.         {
  7.             SessionTest st = new SessionTest();
  8.             lt1.Text = st.a.ToString();
  9.             Session["Ss"] = st;
  10.             //储存到 Session 后更改对象值
  11.             st.a = 2;
  12.         }
  13.     }
  14.     protected void btnSubmit_Click(object sender, EventArgs e)
  15.     {
  16.         SessionTest st2 = Session["Ss"as SessionTest;
  17.         //从 Session 中取出对象并显示
  18.         lt2.Text = st2.a.ToString();
  19.     }
  20. }

在页面上显示 lt2.Text  的值为 2,这个值是在对象储存到 Session 后才改变的,这表明 Session 储存的是对象的引用。这帮了我一个很大的忙,只要在创建对象后将对象储存到 Session,然后对象的更改会在 Session 中实时反应出来,而不用担心 Session 和 对象的同步。

注意:仅测试了状态管理为 Inproc 时的情形。

原文地址:https://www.cnblogs.com/Kung/p/Session.html