将Model(类)写入cookie,序列化与反序列化操作

转自:http://blog.csdn.net/xjzdr/archive/2009/04/24/4105814.aspx

在登录时要保存的用户信息的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FGTWeb.Model
{
    /// <summary>
    /// 在登录时需要保存到Cookie中的信息,属性不够时,以自行添加
    /// </summary>
   [Serializable]
   public class M_Login
    {
        private string _用户id;
        private string _工号;
        private string _姓名;
        private string _用户名;
        private string _密码;
        private int _当前机构id;
        private int _工种id;
        private string _工种名称;
        private string _机构名称;
        private int _父机构ID;
        private string _父机构名称;
        private string _用户登录IP;
        private string _角色id;
        private string _角色名称;
       
        private string _权限;

        private int _主岗位id;
        private string _附岗位id;

        private string _主岗位名称;

        private string _电子邮件;

        /// <summary>
        ///
        /// </summary>
        public string 用户ID
        {
            set { _用户id = value; }
            get { return _用户id; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 工号
        {
            set { _工号 = value; }
            get { return _工号; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 姓名
        {
            set { _姓名 = value; }
            get { return _姓名; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 用户名
        {
            set { _用户名 = value; }
            get { return _用户名; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 密码
        {
            set { _密码 = value; }
            get { return _密码; }
        }
        /// <summary>
        ///
        /// </summary>
        public int 当前机构ID
        {
            set { _当前机构id = value; }
            get { return _当前机构id; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 电子邮件
        {
            set { _电子邮件 = value; }
            get { return _电子邮件; }
        }
        /// <summary>
        ///
        /// </summary>
        public int 工种ID
        {
            set { _工种id = value; }
            get { return _工种id; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 工种名称
        {
            set { _工种名称 = value; }
            get { return _工种名称; }
        }
        /// <summary>
        ///
        /// </summary>
        public string 机构名称
        {
            set { _机构名称 = value; }
            get { return _机构名称; }
        }
        public int 父机构ID
        {
            set { _父机构ID = value; }
            get { return _父机构ID; }
        }

        public string 父机构名称
        {
            set { _父机构名称 = value; }
            get { return _父机构名称; }
        }
       /// <summary>
       ///
       /// </summary>
        public string 用户登录IP
        {
            set { _用户登录IP = value; }
            get { return _用户登录IP; }
        }
        /// <summary>
        /// 一个用户可能属于多个角色,是角色ID的列表
        /// </summary>
        public string 角色id
        {
            set { _角色id = value; }
            get { return _角色id; }
        }
       /// <summary>
        /// 一个用户可能属于多个角色,是角色名称的列表
       /// </summary>
        public string 角色名称
        {
            set { _角色名称 = value; }
            get { return _角色名称; }
        }
        public string 权限
        {
            set { _权限 = value; }
            get { return _权限; }
        }
       
        public int 主岗位id
        {
            set { _主岗位id = value; }
            get { return _主岗位id; }
        }

        public string 主岗位名称
        {
            set { _主岗位名称 = value; }
            get { return _主岗位名称; }
        }
       /// <summary>
       /// 可能有多个岗位,是多个ID的串,中间用,分开
       /// </summary>
        public string 附岗位id
        {
            set { _附岗位id = value; }
            get { return _附岗位id; }
        }
       
    }
}

注意类前面的   [Serializable],表示该类可序列化。

将类序列化和批序列化的方法:

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

           return ByteToStr(buf);
       }
       /// <summary>
       /// 将从Cookie中取出的字符串反序列化成一个FGTWeb.Model.M_Login类
       /// </summary>
       /// <param name="binary"></param>
       /// <returns></returns>
       public static FGTWeb.Model.M_Login DeSerialize(string strLoginUserModel)
       {
           byte[] binary = strToByte(strLoginUserModel);
           BinaryFormatter ser = new BinaryFormatter();
           MemoryStream mStream = new MemoryStream(binary);
           FGTWeb.Model.M_Login o = (FGTWeb.Model.M_Login)ser.Deserialize(mStream);
           mStream.Close();
           return o;
       }

登录页面的代码:

if (model_LoginUser != null)//用户身份验证成功
            {
             string strLoginUserMode = FGTWeb.BLL.BLL_Login.BinarySerialize(model_LoginUser);

                HttpCookie a = new HttpCookie("model_LoginUser");
                a.Value = strLoginUserMode;
               
                Response.Cookies.Add(a);

}

在其它的页面获取用户登录的信息(将cookie中的类反序列化):

 string aa = Request.Cookies["model_LoginUser"].Value.ToString();

            FGTWeb.Model.M_Login model_LoginUser_Test = new FGTWeb.Model.M_Login();
            model_LoginUser_Test = FGTWeb.BLL.BLL_Login.DeSerialize(aa);
            string strtr = "姓名:" + model_LoginUser_Test.姓名 + "(" + model_LoginUser_Test.用户名+")" + "  角色:" + model_LoginUser_Test.角色名称 + "  机构:" + model_LoginUser_Test.机构名称 + "  上级:" + model_LoginUser_Test.父机构名称;
            this.Label1.Text = strtr;

strtr中可以显示登录用户的信息了。

下面的代码更方便,可以任何的对象序列化和反序列化,上面的类的序列化只是一种情况而已:

//序列化

 public static string BinarySerialize(Object obj)
       {
           BinaryFormatter ser = new BinaryFormatter();
           MemoryStream mStream = new MemoryStream();
           ser.Serialize(mStream, obj);
           byte[] buf = mStream.ToArray();
           mStream.Close();

           return ByteToStr(buf);
       }

//反序列化

 /// <summary>
       /// 反序列化对象
       /// </summary>
       /// <param name="strLoginUserModel"></param>
       /// <returns></returns>
       public static object DeSerialize2(string strLoginUserModel)
       {
           byte[] binary = strToByte(strLoginUserModel);
           BinaryFormatter ser = new BinaryFormatter();
           MemoryStream mStream = new MemoryStream(binary);
           object obj = new object();
           obj = (object)ser.Deserialize(mStream);
           mStream.Close();
           return obj;
       }

调用方法:

//序列化

 string strLoginUserMode = FGTWeb.BLL.BLL_Login.BinarySerialize(model_LoginUser);

                HttpCookie a = new HttpCookie("model_LoginUser");
                a.Value = strLoginUserMode;

                Response.Cookies.Add(a);

                //测试反序列化
                string aa = Request.Cookies["model_LoginUser"].Value.ToString();

                FGTWeb.Model.M_Login model_LoginUser_Test = new FGTWeb.Model.M_Login();
                model_LoginUser_Test = (FGTWeb.Model.M_Login)FGTWeb.BLL.BLL_Login.DeSerialize2(aa);
                string strtr = "登录用户名:" + model_LoginUser_Test.用户名 + ",登录角色:" + model_LoginUser_Test.角色名称 + ",所在机构:" + model_LoginUser_Test.机构名称 + ",上级机构:" + model_LoginUser_Test.父机构名称;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xjzdr/archive/2009/04/24/4105814.aspx

原文地址:https://www.cnblogs.com/wangpei/p/1522130.html