• ASP.NET中序列化与反序列化-以显示上一次登录的信息为例


    场景

    ASP.NET中新建Web网站并部署到IIS上(详细图文教程):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107199747

    在上面博客中已经将网站部署到了IIS上。

    .NET Framework 为了保证数据的安全性,并不允许所有的对象都可序列化。

    要序列化某对象,需要将该对象声明为可序列化。把一个类标识为可序列化只需要在类上添加注解Serializable。

    要实现序列化,需要使用System.Runtime.Serialization.Formatters.Binary下的BinaryFormatter类。

    该类提供了Serialize 和Deserialize两个方法实现序列化和反序列化。

    因为是要基于“流”的操作,所以需要使用System.IO下的FileStream类。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    想要记录一下系统最后一次用户登录的信息,包括登录名、登录时间、登录IP。

    纪录以后在每次打开登录页面时显示上一次登录的信息。

    仅仅只有一条信息,没必要在数据库中建个表。

    新建一个Web窗体页面Login.aspx,然后打开其设计视图,拖拽几个标签和输入框

    页面代码为:

        <form id="form1" runat="server">
        <div>
        
            用户名:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <br />
            密 码:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <br />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="登录" />
            <br />
            <br />
            上次登录信息-------------------<br />
            用户名:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            <br />
            登录时间:<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
            <br />
            IP:<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
        
        </div>
        </form>

    要序列化登录信息对象,得新建一个登录信息的类并标记为可序列化

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace DeployTest.Models
    {
        [Serializable]
        public class LoginModel
        {
            private string _loginName;
    
            public string LoginName
            {
                get { return _loginName; }
                set { _loginName = value; }
            }
    
            private DateTime _loginTime;
    
            public DateTime LoginTime
            {
                get { return _loginTime; }
                set { _loginTime = value; }
            }
    
            private string _loginIp;
    
            public string LoginIp
            {
                get { return _loginIp; }
                set { _loginIp = value; }
            }
    
       
    
        }
    }

    在Login.aspx.cs文件里添加两个用于序列化和反序列化对象的方法

            /// <summary>
            /// 序列化对象
            /// </summary>
            /// <param name="fileName"></param>
            /// <param name="lo"></param>
            private void Serializable(string fileName,LoginModel lo) 
            {
                //创建二进制格式对象
                BinaryFormatter bf = new BinaryFormatter();
                //序列化到文件中
                using(FileStream fs = new FileStream(fileName,FileMode.OpenOrCreate))
                {
                    bf.Serialize(fs,lo);
                }
            }
    
            /// <summary>
            /// 反序列化对象
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            private LoginModel Deserializable(string fileName)
            {
                LoginModel lo = null;
                //创建二进制格式对象
                BinaryFormatter bf = new BinaryFormatter();
                //反序列化对象
                using(FileStream fs = new FileStream(fileName,FileMode.Open))
                {
                    lo = bf.Deserialize(fs) as LoginModel;
                }
                return lo;
            }

    然后修改登录按钮的点击事件

            protected void Button1_Click(object sender, EventArgs e)
            {
                //序列化文件的路径
                string fileName = Server.MapPath("~/") + "lastLogin.txt";
                //获取登录的信息并赋值给model
                LoginModel lo = new LoginModel()
                {
                    LoginName = this.TextBox1.Text,
                    LoginTime = DateTime.Now,
                    LoginIp = Request.UserHostAddress
                };
                //将model对象序列化到文件
                this.Serializable(fileName,lo);
            }

    序列化完了,还需要在页面加载的时候将上次序列化的信息展示到页面上,修改Page_Load方法

            protected void Page_Load(object sender, EventArgs e)
            {
                //获取序列化文件路径
                string fileName = Server.MapPath("~/") + "lastLogin.txt";
                try
                {
                    //反序列化文件到model
                    LoginModel lo = this.Deserializable(fileName);
                    //给页面上赋值
                    this.Label1.Text = lo.LoginName;
                    this.Label2.Text = lo.LoginTime.ToString();
                    this.Label3.Text = lo.LoginIp;
                }
                catch { 
                
                }
            }

    运行项目,然后访问Login.aspx页面

    然后来到项目所在目录下,找到并打开lastLogin.txt

  • 相关阅读:
    xxx端口被占用怎么办?
    JavaScript复习--JavaScript的特点和作用
    JavaScript复习--点击按钮,div边框(宽和高)动态增加
    JavaScript复习--评分控件(类似于淘宝给好差平的星星)
    canvas 小记
    overrideMimeType ,接口blob数据转成 base64格式;
    编写一个webpack插件
    html中资源加载优化
    css content 可以怎么用
    关于promise的思考
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/13279470.html
Copyright © 2020-2023  润新知