序列化与反序列化

王柳  金牌会员 | 2024-12-14 10:31:15 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

序列化就是将对象实例的状态存储到存储媒介的过程。
序列化实现对对象信息的永久性存储。
反序列化就是读取文件的过程
序列化和反序列化的实现步骤(json序列化):

  • (1)使用 JsonSerializer.Serialize(student);  返回一个Json字符串
  • 引入System.Text.Json.JsonSerializer   提供了一个非泛型版本
  • 将一个对象序列化为 JSON 字符串,可以使用 JsonSerializer.Serialize<T> 方法;
  • 将 JSON 字符串反序列化为对象,则可以使用 JsonSerializer.Deserialize<T> 方法。 进行反序列化时,指定泛型类型是须要的

    • Student student = JsonSerializer.Deserialize<Student>(json);

序列化单个对象

示例:如下图,实现单个对象的序列化与反序列化

输入学生信息,点击“保存信息"按钮,将学生信息永久序列化保存到电脑上。
关闭程序后,在启动程序,可以将当地序列化文件读取,将信息显示在界面的文本框中。
其中,学号,姓名,年龄文本框的name分别为txtNo,txtName,txtAge。
  1.     internal class Student //学生类
  2. {
  3.     public string StuNum { get; set; }
  4.     public string StuName { get; set; }
  5.     public int StuAge { get; set; }
  6. }
  7.     private void btnSave_Click(object sender, EventArgs e)
  8.     {
  9.         Student student = new Student();
  10.         student.StuNum = this.textNo.Text;
  11.         student.StuName = this.textName.Text;
  12.         student.StuAge = int.Parse(this.textAge.Text);
  13.        
  14.         string json = JsonSerializer.Serialize(student);
  15.         FileStream fs = new FileStream("stu.json", FileMode.Create, FileAccess.ReadWrite);
  16.         StreamWriter sw = new StreamWriter(fs);
  17.         sw.Write(json);
  18.         sw.Close();
  19.         fs.Close();
  20.         MessageBox.Show("序列化成功");
  21.     }
  22. //***************************************************************************************************************
  23.     private void btnReade_Click(object sender, EventArgs e)
  24.     {
  25.         FileStream fs = new FileStream("stu.json", FileMode.Open, FileAccess.ReadWrite);
  26.         StreamReader sr = new StreamReader(fs);
  27.         //读取整个文件内容
  28.         string json = sr.ReadToEnd();
  29.         //关闭流
  30.         sr.Close();
  31.         fs.Close();
  32.         //反序列化Json字符串为Student对象
  33.         Student student = JsonSerializer.Deserialize<Student>(json);
  34.         //使用Student对象信息
  35.         this.textNo.Text = student.StuNum;
  36.         this.textName.Text = student.StuName;
  37.         this.textAge.Text =student.StuAge.ToString();
  38.         MessageBox.Show("**反序列化成功**");
  39.     }
  40. }
复制代码
序列化聚集

示例:如下图,实现聚集的序列化

打开窗体,主动从序列化文件中读取信息,并在listView列表上进行展示。
输入学生信息,点击“添加信息”按钮,添加学生,而且序列化学生列表,刷新ListView列表数据。

  • 序列时传入整个聚集
  
  1.   List<Student> list = new List<Student>();//创建集合存储对象
  2.     private void Form3_Load(object sender, EventArgs e)
  3.     {
  4.         bindDate();
  5.     }
  6.     public void bindDate()
  7.     {
  8.         if (!File.Exists("list.json"))
  9.         {
  10.             return;
  11.         }
  12.         FileStream fs = new FileStream("list.json", FileMode.Open, FileAccess.Read);
  13.         //使用JsonSerializer 将Json字符串反序列为 Student对象的列表
  14.         list = JsonSerializer.Deserialize<List<Student>>(fs);
  15.         fs.Close();
  16.         this.listView1.Items.Clear(); // 清空listView1中的所有项
  17.         foreach (Student stu in list)
  18.         {   // 为每个Student对象创建一个ListViewItem,并设置其主项为学生编号
  19.             ListViewItem item = new ListViewItem(stu.StuNum);
  20.             item.SubItems.Add(stu.StuName);
  21.             item.SubItems.Add(stu.StuAge.ToString());
  22.             this.listView1.Items.Add(item);
  23.         }
  24.     }
  25.     private void btnAdd_Click(object sender, EventArgs e)
  26.     {
  27.         Student student = new Student();
  28.         student.StuNum = this.textNo.Text;
  29.         student.StuName = this.textName.Text;
  30.         student.StuAge = int.Parse(this.textAge.Text);
  31.         list.Add(student);
  32.         //将Student列表序列化为一个Json类型的字符串
  33.         string json = JsonSerializer.Serialize(list);
  34.         FileStream fs = new FileStream("list.json", FileMode.Create, FileAccess.Write);
  35.         StreamWriter sw = new StreamWriter(fs);
  36.         sw.Write(json);
  37.         sw.Close();
  38.         fs.Close();
  39.         MessageBox.Show("保存成功");
  40.         bindDate(); //刷新listView数据列表
  41.     }
  42. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表