• 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 时的情形。

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/Kung/p/Session.html
Copyright © 2020-2023  润新知