如何理解“把一个对象存储于session中”,请对.NET基础了解深刻的同仁来探讨!

问题描述

假如有一实体类:classuserEntity{privatestring_name="";publicstringName{set{_name=value;}get{return_name;}}}

我们在页面中进行了以下操作:userEntityu=newuserEntity();u.Name="test";this.Session["user"]=u;

即将一个实体类存于Session中我的问题是?垃圾加收机质是如何管理此对象的???正常情况下,我们在一个方法中new一个新的对象到一个变量中,变量是在线程堆栈中存放的一个地址,指向托管推中的数据,当方法结束,变量的生命周期结束,线程堆栈中的地址首先失效,然后垃圾回收检测到原来该地址指向数据已经在线程堆栈中没有地址指向,则回收托管堆中的数据。存于Session的情况是不是这样子的,session变量中存的也是一个地址,这个地址的生命周期就是session变量的生命周期,session丢失之后,才会回收托管堆中的数据??之所以得出这样的结论是因为我测试过这样的情况,在一个页面中userEntityu=(userEntity)Session["user"];u.Name="changed";

然后在另一个页面userEntityu=(userEntity)Session["user"];Response.Write(u.Name);

结果显示为"changed"由此我得出结论,SESSION中存的为一个地址;但另一种情况又让我无法解释??在session存储设置为存储于sqlserver中的WEB应该程序中。我将一对象存于Session中,对象的类必须为可序列化的,既然只是存一个地址的话,为何要要求类可序列化,这让我感觉SESSION中存储又应该是数据本身。。。有高手指点儿一下吗?这两天老在想这个问题。。。

解决方案

解决方案二:
存放session中的变量是有生命周期的.一般1分钟左右会检测一次.测量时间可以使用Global.asax中Session_StartSession_End来测量系统多长时间来检测session是否过期时间.设置seession过期时间为30秒.如果系统为1分钟为检测一次.则1分钟才触发SessionEnd事件.如果session过期则销毁.-------------------------------------------------------------------------------------在session存储设置为存储于sqlserver中的WEB应该程序中。是以文本形式存在放数据库.把对象转换成文本形式.需要类必须为可序列化.两种存储机制不一样,前一种是存放在服务器内存中,后一种以持久化方式存放在数据库中。
解决方案三:
Session也会发送至客服端吧....不太清楚。。up
解决方案四:
IIS进程来回收SESSION..服务器繁忙的时候..IIS的进程会自动回收Session..所有有的时候Session的值会丢失.请尽量少使用Session.---------------------------------------------------------结果显示为"changed"由此我得出结论,SESSION中存的为一个地址;但另一种情况又让我无法解释??在session存储设置为存储于sqlserver中的WEB应该程序中。我将一对象存于Session中,对象的类必须为可序列化的,既然只是存一个地址的话,为何要要求类可序列化,这让我感觉SESSION中存储又应该是数据本身。。。----------------------------------当会话存储在SQLSERVER数据库中,每个WEB请求结束时在客户端的SESSION集合中序列化并保存所有对象..当客户端重新访问服务器时..相关的辅助进程从状态服务器中以二进制流的形式检索这些对象.请它们反序列化为实时实例,并将它们放置回对请求处理程序的新Session集合对象中.-------------------------------SESSION的三种存储模式要理解清楚...
解决方案五:
IIS进程来回收SESSION..服务器繁忙的时候..IIS的进程会自动回收Session..所有有的时候Session的值会丢失.请尽量少使用Session.---------------------------------------------------------结果显示为"changed"由此我得出结论,SESSION中存的为一个地址;但另一种情况又让我无法解释??在session存储设置为存储于sqlserver中的WEB应该程序中。我将一对象存于Session中,对象的类必须为可序列化的,既然只是存一个地址的话,为何要要求类可序列化,这让我感觉SESSION中存储又应该是数据本身。。。----------------------------------当会话存储在SQLSERVER数据库中,每个WEB请求结束时在客户端的SESSION集合中序列化并保存所有对象..当客户端重新访问服务器时..相关的辅助进程从状态服务器中以二进制流的形式检索这些对象.请它们反序列化为实时实例,并将它们放置回对请求处理程序的新Session集合对象中.-------------------------------SESSION的三种存储模式要理解清楚...______________________________________________________________________________________多谢回答,在用SQLSERVER存储时,我们到SESSION中的对象取出,做以下操作:userEntityu=(userEntity)Session["user"];u.Name="changed";而不写以下语句:Session["user"]=u;也就是说不显式的把对象再存回SESSION变量中,但我在另一个页面重新访问SESSION变量,得到NAME属性的值也还会变成"changed",,这是为什么呀??难道userEntityu=(userEntity)Session["user"];u.Name="changed";这样的语句就可以导致SESSION机制更新存储于SQLSERVER中的序列化后的值吗??按我的理解,应该要显式的写出Session["user"]=u;这样的语句,才会让SQLSERVER更新序列化值呀??请高手解答
解决方案六:

解决方案七:
该回复于2008-06-04 17:32:42被版主删除
解决方案八:
userEntityu=(userEntity)Session["user"];u.Name="changed";而不写以下语句:Session["user"]=u;也就是说不显式的把对象再存回SESSION变量中,但我在另一个页面重新访问SESSION变量,得到NAME属性的值也还会变成"changed",,这是为什么呀??难道userEntityu=(userEntity)Session["user"];u.Name="changed";这样的语句就可以导致SESSION机制更新存储于SQLSERVER中的序列化后的值吗??按我的理解,应该要显式的写出Session["user"]=u;这样的语句,才会让SQLSERVER更新序列化值呀??请高手解答--------------------------------------------------------------------------------------------Session["user"]中存放的是实体对象引用地址.userEntityu=(userEntity)Session["user"];u存放的也是实体引用地址与Session["user"]存放的是一致的.u与Session["user"]都是指向一个内存地址.进程检测到Seesion管理的对象内容发生改变.就会序列化.
解决方案九:

时间: 2024-09-20 16:29:57

如何理解“把一个对象存储于session中”,请对.NET基础了解深刻的同仁来探讨!的相关文章

php中将一个对象保存到Session中的方法

 这篇文章主要介绍了php中将一个对象保存到Session中的方法,涉及php操作对象及session的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php中将一个对象保存到Session中的方法.分享给大家供大家参考.具体如下: 要保存对象到session其实很简单,我们可以使用session_register()函数,下面是使用范例 person_class.inc.php如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

php中将一个对象保存到Session中的方法_php技巧

本文实例讲述了php中将一个对象保存到Session中的方法.分享给大家供大家参考.具体如下: 要保存对象到session其实很简单,我们可以使用session_register()函数,下面是使用范例 person_class.inc.php如下: <?php // //File: person_class.inc.php //Contains the class definition necessary to let an object be a session //variable. //

怎么在Global.asax中获取Session中的值

问题描述 我在想在Application_BeginRequest里监控用户的都提交了什么,但是就是没法获取Session存的用户名,大神们这该怎么做 解决方案 解决方案二:参考解决方案三:实现下System.Web.SessionState.IReadOnlySessionState接口试试解决方案四:对,要实现sessionstate接口才行解决方案五:使用Session判断用户登录状态记录用户//将用户名存储到Session中protectedvoidButton1_Click(objec

ASP.NET Session使用详解_基础应用

Session模型简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份.这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子. 这个唯一的SessionID是有很大的实际意义的.当一个用

在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍. 在

深入理解HTTP会话控制: PHP Session与Cookie

本文介绍了PHP会话控制,主要阐述以下几点内容: • 会话控制的产生背景/概念 • cookie的维护与生命周期(有效时间) • session的维护与生命周期(回收机制) • cookie与session之间的区别与联系 • 问题1:禁用cookie后session为什么会失效? • 问题2:IE浏览器下丢失session,每次刷新页面,都会生成新的sessionID(Firefox浏览器正常) • session.cookie简单实例 .session配置方法 .session安全设置 ●

同步可以理解为保持多个设备中数据一致

文章描述:同步技术的应用趋势. 年中Apple发布了icoud,基于原有的MobileMe功能全新改写而成,提供了原有的邮件.日历和联络人同步功能.可见其中重要的功能就是同步,越来越多的手机和应用程序中都在应用同步,那同步的技术原理和未来应用趋势是什么呢? 同步可以理解为保持多个设备中数据一致,需求可能来源于以下几种常见场景: 1.用户频繁地使用USB导入和导出数据,比如图片.电影和音乐等文件数据. 2.用户需要保证多设备之间的数据一致,随时调用最新的数据.多人也可以协同编辑同一文件. 3.设备

实现基于文件存储的Session类

session 我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高,毕竟跟磁盘IO是有关系的,如果需要多台服务器共享数据,可以考虑使用NFS来存储数据,如果需要比较快的速度,可以考虑使用共享内存(shm)来保存数据,直接把Session数据存储路径指定为/dev/shm,这样磁盘IO会提高不少,不过shm空间比较小,一般Linux下

实现基于Memcache存储的Session类

cache|session 我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合PHP的Memcache扩展,能够支