C#笔记——【面向对象基础】(九)对象序列化与XML文件

(一)对象序列化与反序列化

1)文本保存对象的不足

  • 当对象属性发生变化的时候,需要增加或者减少信息的写入或者读取次数;
  • 信息安全性较差;
    在这里插入图片描述

2)对象保存的新方法:

使用序列化和反序列化保存和还原对象;相对象作为一个整体,一次性保存,而后一次性还原;
在这里插入图片描述

注意:集合对象也可以保存;对文件保存尽量使用序列化和反序列化,当然对于一般的小文件直接使用文本文件也是可以的;

3)序列化的具体操作:

错误:

凡是遇到下面的错误,首先使得这个对象能够序列化,通常在要序列化的对象前面加上[Serializable]这个对象可序列化标记
在这里插入图片描述
在这里插入图片描述

序列化代码:

序列化之后,变为object类型,所以反序列化之后是object类型,需要进行强制类型转换;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

//引入命名空间
using System.IO;
//引入特定命名空间:二进制格式化器
using System.Runtime.Serialization.Formatters.Binary;

namespace TextFile
{
    public partial class FrmFile : Form
    {
        public FrmFile()
        {
            InitializeComponent();
        }
        private void btnSerialize_Click(object sender, EventArgs e)
        {
            //封装对象信息
            Student objStu = new Student()
            {
                Name = this.txtName.Text.Trim(),
                Age = Convert.ToInt16(this.txtAge.Text.Trim()),
                Gender = this.txtGender.Text.Trim(),
                Birthday = Convert.ToDateTime(this.txtBirthday.Text.Trim())
            };
            //【1】创建文件流
            FileStream fs = new FileStream("D:\\myFile\\objStudent.stu", FileMode.Create);
            //【2】创建二进制格式化器
            BinaryFormatter formatter = new BinaryFormatter();
            //【3】调用序列化方法
            formatter.Serialize(fs, objStu);
            //【4】关闭文件流
            fs.Close();
        }
    }
}

在这里插入图片描述

反序列化代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

//引入命名空间
using System.IO;
//引入特定命名空间:二进制格式化器
using System.Runtime.Serialization.Formatters.Binary;

namespace TextFile
{
    public partial class FrmFile : Form
    {
        public FrmFile()
        {
            InitializeComponent();
        }
        private void btnDeserialize_Click(object sender, EventArgs e)
        {
            //【1】创建文件流
            FileStream fs = new FileStream("D:\\myFile\\objStudent.stu", FileMode.Open);
            //【2】创建二进制格式化器
            BinaryFormatter formatter = new BinaryFormatter();
            //【3】调用反序列化方法,序列化之后变为object类型
            Student objStudent = (Student)formatter.Deserialize(fs); //反序列化以后是object类型存在,所以要强制类型转换
            //【4】关闭文件流
            fs.Close();

            //显示数据
            this.txtName.Text = objStudent.Name;
            this.txtAge.Text = objStudent.Age.ToString();
            this.txtGender.Text = objStudent.Gender;
            this.txtBirthday.Text = objStudent.Birthday.ToShortDateString();
        }
    }
}

在这里插入图片描述

4)序列化与反序列化的应用

应用场合:
  • 应用系统配置信息(如果信息量较大,则使用该方法更方便读取和写入);
  • 不需要使用数据库的时候,可以作为数据存取的载体;
  • WebService中帝乡的传递;
  • 模块之间数据的传递;
序列化与反序列化对象的好处:
  • 对象保存和读取方便,扩展性强;
  • 数据安全高效;

(二)XML文件操作

1)XML简介

  • XML是eXtensible Markup Language的缩写,即可扩展标记语言;
  • 它是一种可以用来创建自定义的标记语言,由万维网协会(W3C)创建,用来克服HTML的局限性;
  • 从使用功能上看,XML主要用于数据的存储,而HTML主要用于数据显示
    在这里插入图片描述

2)XML文档的格式要求与语法要求

格式要求:
  • 确定且唯一的根元素;
  • 开始标签和结束标签匹配;
  • 元素标签的正确嵌套;
  • 属性值要使用引号括起来;
  • 同一个元素的属性不能重复;
语法要求:
  • 元素:<标签> 文本内容 </标签>
  • 处理指令:<?xml version="1.0"?>
  • 注释:在这里插入图片描述
  • 属性:<salary currency=""US$> 25000 < /salary>【去掉/前面的空格】

3)应用

  • 跨平台数据交互,典型应用是webservice的使用;
  • 常见的webservice是列车时刻表;

4) XML文件读取

  • 包含学生信息的XML文件数据与数据读取;步骤:
    • 创建文档对象;
    • 加载XML文档;
    • 获取根节点;
    • 遍历节点并封装数据;
实现代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Xml;//引入命名空间

namespace XMLDemo
{
    public partial class FrmReadXML : Form
    {
        public FrmReadXML()
        {
            InitializeComponent();
        }
        private void btnLoadXML_Click(object sender, EventArgs e)
        {
            XmlDocument objDoc = new XmlDocument();  //【1】创建XML文档操作对象
            objDoc.Load("StuScore.xml");  //【2】加载XML文件到文档对象中
            XmlNode rootNode = objDoc.DocumentElement;  //【3】获取XML文档根目录
            List<Student> list = new List<Student>();//创建对象集合         
            foreach (XmlNode stuNode in rootNode.ChildNodes)  //【4】遍历根节点(根节点包含所有节点)
            {
                if (stuNode.Name == "Student")
                {
                    Student objStu = new Student();
                    foreach (XmlNode subNode in stuNode)  //【5】遍历子节点
                    {
                        switch (subNode.Name)//根据子节点的名称封装到对象的属性
                        {
                            case "StuName":
                                objStu.StuName = subNode.InnerText;//获取《节点名称》对应的《节点值》
                                break;
                            case "StuAge":
                                objStu.StuAge = Convert.ToInt16(subNode.InnerText);
                                break;
                            case "Gender":
                                objStu.Gender = subNode.InnerText;
                                break;
                            case "ClassName":
                                objStu.ClassName = subNode.InnerText;
                                break;
                        }
                    }
                    list.Add(objStu);
                }
            }
            //将数据显示在DataGridView中
            this.dgvStuList.DataSource = list;
        }
        //显示版本信息
        private void btnShowVersion_Click(object sender, EventArgs e)
        {
            //创建XML读取器
            XmlTextReader tReader = new XmlTextReader("StuScore.xml");

            string info = string.Empty;

            //循环查询
            while (tReader.Read())
            {
                if (tReader.Name == "Version")
                {
                    info = "版本:" + tReader.GetAttribute("vNo") + " 发布时间:" 
                        + tReader.GetAttribute("pTime");
                    break;
                }
            }
            MessageBox.Show(info,"数据版本");
        }
    }
}
注意:
  • 在DataGridView中显示数据的时候,这个DataGridView的name和DataPropertyName最好一致,后者的名称实际上就是类里面的属性的名称,两者要一样才能显示;

5)XML文件读取总结

常用对象:
  • XMLDocument对象表示XML整个文档;
  • XmlNode对象表示XML文件的单个节点;
常用属性及说明:

在这里插入图片描述

6)从XML文件中找到特定节点

使用遍历的方法非常麻烦,而且效率低下;
可以使用查找方法;

在这里插入图片描述

发布了37 篇原创文章 · 获赞 1 · 访问量 1144

猜你喜欢

转载自blog.csdn.net/forever_008/article/details/104103343