关于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
="data source=127.0.0.1;Trusted_Connection=yes"  
            cookieless
="false"   
            timeout
="20"   
    
/>

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

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

 [Serializable()] 
    
public   class  ProductInfo  { 
         
        
private string f_SysID; 
         
                
        
public string SysID { 
            
get { 
                
return this.f_SysID; 
            }
 
            
set { 
                
this.f_SysID = value; 
            }
 
        }
 
 

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

[Serializable] 
    
public   class  CartManager : ISerializable 
    
{ 
        
private ArrayList _cart=new ArrayList(); 
 
        
public CartManager() 
        
{ 
        }
 
 
          
           //实现了ISerializable接口的类必须包含有序列化构造函数,否则会出错。
         protected  CartManager(SerializationInfo info, StreamingContext context)  
        
{ 
            
this._cart=(ArrayList)info.GetValue("_cart",typeof(ArrayList)); 
        }
 
 
        
void  ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)  
        
{ 
            info.AddValue(
"_cart",this._cart); 
        }
 
 
        
private  CartInfo findCartInfo( string  sid) 
        
{ 
            
foreach(CartInfo ci in this._cart) 
            
{ 
                
if( ci.Product.SysID.Equals(sid) ) return ci; 
            }
 
            
return null
        }
 
         
 
        
public  ArrayList getCart() 
        
{ 
            
return this._cart; 
        }
 
 

   
 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值