`
yesjavame
  • 浏览: 657582 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于SessionState与序列化的一点教训

阅读更多

很简单的东西,因为在学习中遇到了,所以记录下来.

事情的起因是,我在做一个购物蓝时,将一个自定义的类CartManager整个放进Session中,它的部分代码如下,其实就是有一个Private 的ArrayList成员_cart用来放CartInfo类实例,而CartInfo类又包括一个成员ProductInfo _product和一个double _moneny...并不复杂.但是我都没有弄任何Serializable的东西,于是...

本机调试没问题,放到服务器上却发现这个购物车表现非常怪异,时好时坏,总觉得好象Session里的东西乱得很,有时能存进去有时存不进?

比较了本机与服务器的环境,我知道问题肯定与SessionState有关.因为服务器用了Web Farm(并且将最大工作进程数设置成了10).

一般我们在做一个WEB Application的时候,它的SessionState的Mode=InProc的,可参见web.config文件中的配置

<sessionState
mode="InProc"
stateConnectionString
="tcpip=127.0.0.1:42424"
sqlConnectionString
="datasource=127.0.0.1;Trusted_Connection=yes"
cookieless
="false"
timeout
="20"
/>

在服务器上,因为存在多个工作进程,所以需要将它的写法改成 mode=StateServer了,否则就会造成前面所说的Session中的值不确定的现象.但是,如果简单地这样改一下,系统又报错说对于以 StateServer 或者 SqlServer两种方式保存会话状态,要求对象是可序列化的(大意如此)...所以我们还需要再将对象做一下可序列化声明.

如果要保存的对象很简单,都是由基本类型组成的,就只需要声明一下属性即可,如:

[Serializable()]
publicclassProductInfo{

privatestringf_SysID;


publicstringSysID{
get{
returnthis.f_SysID;
}

set{
this.f_SysID=value;
}

}

对于本例中,CartInfo与 ProductInfo两个类,可以这样声明一下.只是CartManager就稍多几句话,如下:

[Serializable]
publicclassCartManager:ISerializable
{
privateArrayList_cart=newArrayList();

publicCartManager()
{
}


protectedCartManager(SerializationInfoinfo,StreamingContextcontext)
{
this._cart=(ArrayList)info.GetValue("_cart",typeof(ArrayList));
}


voidISerializable.GetObjectData(SerializationInfoinfo,StreamingContextcontext)
{
info.AddValue(
"_cart",this._cart);
}


privateCartInfofindCartInfo(stringsid)
{
foreach(CartInfociinthis._cart)
{
if(ci.Product.SysID.Equals(sid))returnci;
}

returnnull;
}



publicArrayListgetCart()
{
returnthis._cart;
}


这样实现了整个CartManager--CartInfo--ProductInfo的可序列化声明,于是就一切正常了...

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics