类序列化之后保存在COOKIES里


      我们知道,在.NET中页面之间传值的方式有很多种,比如SESSION,COOKIES,Response.Redirect,URL等等;
具体用哪种方式要具体问题具体分析了,比如说就一个字段需要传到下一个页面,那么URL和Response.Redirect方式是不二选择;
如果对象较大的话,我们会考虑使用session,cookies,使用Session的话,在数据量大的时候有可能会造成IIS崩溃,导致站点无法访问,
那我们就使用COOKIES,有的朋友又会说,cookies容易丢失,确实是的,不过如果cookies用得好的话也不会丢失哦。
    接下来我介绍将类对象序列化之后保存在COOKIES里。
    在使用序列化之前,首先想一下,为什么要先将对象序列化然后写入COOKIES呢?不进行序列化就不行吗?序列化以后对象变成什么样子呢?
带着这几个问题我们来看看源代码:
首先创建类:其中[Serializable]标示该类可以被序列化

[Serializable]
    public class mbmembers
    {
        public mbmembers()
        {

        }

        #region "Private Variables"    
        private string _M_UserName;  // 帐号
        private string _M_RealName;  // 真实姓名
        private string _M_IDCard;  // 证件号码
        private string _M_Email;  // 电子邮件信箱
        private string _M_Mobile;  // 手机号码
        #endregion

        #region "Public Variables"
        /// <summary>
        /// 帐号
        /// </summary>
        public string M_UserName
        {
            set { this._M_UserName = value; }
            get { return this._M_UserName; }
        }

        /// <summary>
        /// 真实姓名
        /// </summary>
        public string M_RealName
        {
            set { this._M_RealName = value; }
            get { return this._M_RealName; }
        }

        /// <summary>
        /// 证件号码
        /// </summary>
        public string M_IDCard
        {
            set { this._M_IDCard = value; }
            get { return this._M_IDCard; }
        }

        /// <summary>
        /// 电子邮件信箱
        /// </summary>
        public string M_Email
        {
            set { this._M_Email = value; }
            get { return this._M_Email; }
        }

        /// <summary>
        /// 手机号码
        /// </summary>
        public string M_Mobile
        {
            set { this._M_Mobile = value; }
            get { return this._M_Mobile; }
        } 
      #endregion
    }
接下来提供序列化和反序列化的方法:

      /// <summary>
       /// 对类mbmembers进行二进制序列化成一个字符串
       /// </summary>
       /// <returns>序列化代码</returns>
       public  string  BinarySerialize(mbmembers model)
       {
           BinaryFormatter ser = new BinaryFormatter();
           MemoryStream mStream = new MemoryStream();
           ser.Serialize(mStream, model);
           byte[] buf = mStream.ToArray();
           mStream.Close();

           return System.Text.Encoding.Default.GetString(buf);
       }
       /// <summary>
       /// 将从Cookie中取出的字符串反序列化成一个mbmembers类
       /// </summary>
       /// <param name="binary"></param>
       /// <returns></returns>
       public  mbmembers DeSerialize(string strLoginUserModel)
       {
           byte[] binary = System.Text.Encoding.Default.GetBytes(strLoginUserModel);
          
           BinaryFormatter ser = new BinaryFormatter();
           MemoryStream mStream = new MemoryStream(binary);
           mbmembers o = (mbmembers)ser.Deserialize(mStream);
           mStream.Close();
           return o;
       }


  将用户个人信息序列化之后 写入COOKIES:
            mbmembers bs = new mbmembers();
            
            Response.Cookies["userinfo"].Value = BinarySerialize(bs); //序列化
            Response.Cookies["userinfo"].Expires = DateTime.MinValue;

            
            string str= Request.Cookies["userinfo"].Value; //反序列化
            mbmembers mb = DeSerialize(str);

以上是所有源代码,可能比较难看懂,首先你应该明白系列化的目的就不难理解他了。系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算。比如你的客户端要调用服务器上的一个方法获得一个产品对象,比如方法为:public   Product   findProduct(int   product_id);  
  注意该方法返回一个Product对象,如果没有系列化技术,客户端就收不到返回的对象Product。而序列化的实现就是把对象变成一个可在网络上传输的字节流。

不过此处,如果您不想序列化,而是直接将对象保存在COOKIES里面也是可以的,这就需要循环遍历对象里面的信息,将里面的信息拼接成字符串,然后存储在COOKIES中。

 


posted @ 2009-08-19 15:23  woalang  阅读(548)  评论(0编辑  收藏  举报