首页 > 代码库 > 014.序列化与反序列化

014.序列化与反序列化

1、序列化
序列化:串行化 对象持久化 将对象存储到文件或数据库的字段中
反序列化:将文件恢复成对象
作用:
1、永久保存数据
2、传递数据


要序列化的对象对应的类以及类的属性、子类必须是可序列化的


要序列化的对象对应的类以及类的属性、子类必须是可序列化的


实现序列化反序列化需要引用命名空间:

Using system.runtime.seralization.formatters.binary;

Runtime 运行时

serialization 序列化

Formatters 格式化程序,格式器

Binary 二进制的

使用实例:题==>创建一个可序列化的类(姓名,地址),然后新建一个本地文件存储信息,进行序列化和反序列化***

1.新建一个Student类,属性有学生的ID/Name/Age/Sex,定义一个父类的重写方法,实现格式化字符串:

namespace Binary
{
[Serializable]//指示一个类可以被序列化 无法继承此类
public class Student
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
private string sex;

public string Sex
{
get { return sex; }
set { sex = value; }
}
private string qq;

public string Qq
{
get { return qq; }
set { qq = value; }
}
private string homepage;

public string Homepage
{
get { return homepage; }
set { homepage = value; }
}
public Student() { }
public override string ToString()
{
return "学号:" + this.Id + "\n姓名:" + this.Name + "\n性别:" + this.Sex + "\nQQ:" + this.Qq + "\n" + this.Homepage;
}
}
}

2.Main函数中两个方法,序列化和反序列化的方法:

/// <summary>
/// 二进制序列化
/// </summary>
/// <param name="stu"></param>
public static void SerializeStudent(Student stu)
{
FileStream fs = new FileStream("d:\\studentinfo.dat", FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(fs,stu);
fs.Flush();
fs.Close();
fs.Dispose();
}

/// <summary>
/// 反序列化
/// </summary>
/// <param name="filename"></param>
public static void DeSerializeStudent(string sadf)
{
FileStream fs = new FileStream(sadf, FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
BinaryFormatter b = new BinaryFormatter();
Student stu = (Student)b.Deserialize(fs);
Console.WriteLine(stu.ToString());
fs.Flush();
fs.Close();
fs.Dispose();
}

3.在Main函数中给属性赋值并实现两个自定义方法的调用,并捕获可能出现的异常:

static void Main(string[] args)
{
Student stu = new Student();
stu.Id = 20161108;
stu.Name = "张三";
stu.Sex = "男";
stu.Qq = "914455044";
stu.Homepage = "www.baidu.com";
try
{
SerializeStudent(stu);
string path = "d:\\studentinfo.dat";
DeSerializeStudent(path);
}
catch (Exception ex)
{

Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
2、调试

作用:
理解算法或流程
找出错误(算法的错误、异常)


F5:启动调试 停在下一个断点处
ctrl+F5:开始运行(不调试)
F6:生成
F9:切换断点
F10:逐过程
F11:逐语句
shift+F11:运行处方法
Ctrl+F10:运行到光标处 相当于在光标处添加了一个断点
拖拽箭头:直接跳转到要执行的代码(中间语句不执行)可能产生不可预知的错误,不建议使用

 

条件中断:
命中次数:
命中条件:不中断


3、异常
1、异常
2、异常处理
3、语法
try
{
//可能出现异常的代码
}
catch(异常类 变量)
{
//异常的处理
//记录日志
//提示
}
finally//可省略
{
//一定会被执行的代码
//比如 数据库的关闭
}

try
{}
catch()
{}

try
{}
finally
{}

try
{}
catch()
{}
finally{}

catch块可以有多个
具有继承关系的多个异常类,子类在前,父类在后


练习
建立一个类,用于异常处理,要求提供一个公共方法WriteErrorLog(),此方法用于将异常的相关信息记录在日志文件中。使用时,在另外一个类写代码,发生异常后在 catch中调用这个方法,将异常信息记录到日志文件中。
提示:此方法具有一个参数 Exception类型

1、创建一个类
2、在类中添加方法
public static void WriteErrorLog(Exception ex)
{
//写入
}

 

014.序列化与反序列化