CH13-序列化和反序列化

本章目标

  1. 理解序列化和反序列化
  2. 掌握二进制序列化和反序列化
  3. 掌握XML序列化和反序列化

本章内容

1、概念

  1. 什么是序列化:

    通常,我们需要将对象存储要物理存储中,这要可以释放内存,在需要的时候,我们又需要从物理存储中读回并转换回对象。

    在此过程中,对象的公共字段和私有字段以及类的名称(包括该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确副本。

    序列化:将对象存储到物理存储的过程称为序列化。

    1722415972599

  2. 反序列化:

    反序列化:将序列化对象读回内存的过程是反序列化。

    1722416386570

2、序列化实现步骤

  1. 序列化一个类最简单的方式是试用如下所示的Serializable属性标记

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Serializable]//标识类可以被序列化
    internal class Student
    {
    public int StudentNo { get; set; }
    public string StudentName { get; set; }
    public int Age { get; set; }

    public void SayHi()
    {
    Console.WriteLine($"大家好:我叫:{StudentName},学号:{StudentNo},年龄:{Age}");
    }
    }

    注意事项:

    1. 如果类中有字段不需要被序列化,可以加上[NonSerialized],引特性只能加在字段上面,例如:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      [Serializable]
      internal class Student
      {
      [NonSerialized]
      public int StudentNo;
      public string StudentName { get; set; }
      public int Age { get; set; }

      public void SayHi()
      {
      Console.WriteLine($"大家好:我叫:{StudentName},学号:{StudentNo},年龄:{Age}");
      }
      }
  2. 实现序列化操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    using System.Runtime.Serialization.Formatters.Binary;//引入命名空间
    static void Main(string[] args)
    {
    Student student = new Student()
    {
    StudentNo = 1001,
    StudentName = "张三",
    Age = 18
    };

    //1、创建文件流
    FileStream fs = new FileStream("student.bin", FileMode.OpenOrCreate);
    //2、创建二进制格式器
    BinaryFormatter bf = new BinaryFormatter();
    //3、实现序列化操作
    bf.Serialize(fs, student);
    }

3、反序列化实现步骤

  1. 实现代码:

    1
    2
    3
    4
    5
    6
    7
    //1、创建文件流
    FileStream fs = new FileStream("student.bin", FileMode.OpenOrCreate);
    //2、创建二进制格式器
    BinaryFormatter bf = new BinaryFormatter();
    //3、实现反序列化
    Student stu = (Student)bf.Deserialize(fs);
    stu.SayHi();
  2. 实现效果:

    1722417216983

4、XML方式实现序列化和反序列化操作

  1. 通过XML实现序列化操作

    1. 首先,创建要序列化的对象并设置它的公共属性和字段,而且必须确定用以存储XML 流的传输格式(或者作为流,或者作为文件)。例如,如果XML 流必须以永久形式保存,则创建FileStream 对象。当反序列化对象时,传输格式将确定创建流还是文件对象。确定了传输格式之后,就可以根据需要调用Serialize 或Deserialize 方法。

      1
      2
      //1、创建文件流
      FileStream fs = new FileStream("student2.xml", FileMode.OpenOrCreate);
    2. 其次,使用该对象的类型构造XmlSerializer。

      1
      2
      //2、创建XML序列化格式器
      XmlSerializer xmlSerializer = new XmlSerializer(typeof(Student));
    3. 最后,调用Serialize 方法以生成对象的公共属性和字段的XML 流表示形式或文件表示形式。

      1
      2
      //3、实现序列化操作
      xmlSerializer.Serialize(fs, student);
    4. 生成序列化后效果图:

      1722417929750

  2. 通过XML实现反序列化操作

    1
    2
    3
    4
    5
    6
    7
    //1、创建文件流
    FileStream fs = new FileStream("student2.xml", FileMode.OpenOrCreate);
    //2、创建XML序列化格式器
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Student));
    //3、实现序列化操作
    Student stu = (Student)xmlSerializer.Deserialize(fs);
    stu.SayHi();

本章总结

  1. 理解序列化
  2. 会通过二进制方式实现序列化操作
  3. 会通过XML方式实现序列化操作

本章作业

  1. 完善网络电视精灵,将卖票信息通过序列化方式保存
  2. 完善网络电视精灵,打开程序是,点击 获取最新购票信息,将保存在文件中的卖票信息加载出来