(asp.net)关于SessionState与序列化的一点教训(转载)

4小时前 (05:50:47)阅读1回复0
lrj
lrj
  • 管理员
  • 注册排名2
  • 经验值72350
  • 级别管理员
  • 主题14470
  • 回复0
楼主

  很简单的工具,因为在进修中碰着了,所以笔录下来.

  工作的原因是,我在做一个购物蓝时,将一个自定义的类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()

  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
回帖

(asp.net)关于SessionState与序列化的一点教训(转载) 期待您的回复!

取消