(一)对象序列化与反序列化
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文件中找到特定节点
使用遍历的方法非常麻烦,而且效率低下;
可以使用查找方法;