zoukankan      html  css  js  c++  java
  • 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 时的情形。

  • 相关阅读:
    微信公众号开发 该公众号提供的服务出现故障,请稍后再试
    docker 搭建以太坊私有链搭建
    docker /var/lib/docker/aufs/mnt 目录满了,全是垃圾数据
    golang 如何将imagemagick 和golang 打包到docker 环境中
    CSharpGL(2)设计和使用场景元素及常用接口
    CSharpGL(1)从最简单的例子开始使用CSharpGL
    CSharpGL(0)一个易学易用的C#版OpenGL
    Opengl中矩阵和perspective/ortho的相互转换
    C#+OpenGL+FreeType显示3D文字(3)
    C#+OpenGL+FreeType显示3D文字(2)
  • 原文地址:https://www.cnblogs.com/Kung/p/Session.html
Copyright © 2011-2022 走看看