<strong id="324zd"><source id="324zd"><font id="324zd"></font></source></strong>
  • <li id="324zd"><acronym id="324zd"></acronym></li>
          1. <button id="324zd"><acronym id="324zd"></acronym></button>

            <em id="324zd"><acronym id="324zd"><input id="324zd"></input></acronym></em><button id="324zd"></button><tbody id="324zd"></tbody>
              虚拟主机域名注册-常见问题虚拟主机问题 → 虚拟主机问题


            (asp.net)关于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()
            {
            }

            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的可序列化声明,于是就一切正常了...


            文章出自:
            http://www.cnblogs.com/sharetop/archive/2005/10/08/250286.html



            来源:
            阅读:5643
            日期:2007-03-29

            【 双击滚屏 】 【 推荐朋友 】 【 收藏 】 【 打印 】 【 关闭 】 【 字体: 】 
            上一篇:常见术语介绍
            下一篇:虚拟主机开启URLrewrite功能的方法介绍
              >> 相关文章
             
            点击关闭
            • 售前客服
              王经理
              微信:1766534168
              微信二维码
            18931655174
            可以免费观看av的网站
            <strong id="324zd"><source id="324zd"><font id="324zd"></font></source></strong>
          2. <li id="324zd"><acronym id="324zd"></acronym></li>
                  1. <button id="324zd"><acronym id="324zd"></acronym></button>

                    <em id="324zd"><acronym id="324zd"><input id="324zd"></input></acronym></em><button id="324zd"></button><tbody id="324zd"></tbody>