• Java IO---序列化和反序列化


    一.序列化和反序列化介绍

    1. 什么是序列化和反序列化?

      ​ 序列化就是将对象转换为字节序列的过程。

      ​ 反序列化就是将字节序列恢复为对象的过程。

    2. 序列化的用途在哪?

      通常情况下,序列化有两个用途:

      • 将对象的字节序列永久的保存到硬盘上,一般存在一个文件中。
      • 在网络中传送对象的字节序列。
    3. 序列化的意义?

      序列化机制使得对象可以脱离程序的运行而独立存在,能够离开内存空间,以便能长期保存。

      比如:一个记录用户信息设置的类,当程序退出后下次再运行要保留上次的信息设置,此时就可以把这个类作为配置文件存在磁盘上,每次运行时再读取。

    二.序列化和反序列化要点

    1. 序列化接口(Serializable

      要序列化的对象必须实现Serializable接口,否则将出现异常NotSerializableException,无法序列化

    2. transient关键字

      注意并不是所有的元素都需要序列化,当某些元素不需要序列化时,可以使用transient关键字修饰,被transient修饰的元素,不会进行jvm默认的序列化。

    3. jvm是否允许反序列化,不仅与类的路径和功能代码是否一致相关,更重要的是类的序列化ID是否一致,也就是private static final long serialVersionUID

      序列化ID有两种生成策略:一种是固定的1L,一种是随机生成一个不重复的long类型数据;

      建议是:没有特殊需求就使用默认的1L。

    4. 序列化不保存静态变量。

      因为序列化保存的是对象的状态,静态变量是属于类的状态的,因此序列化不会保存静态变量。

    这篇文章讲的比较清晰,个人觉得不错:[Java 序列化的高级认识(转载)]

    三.序列化和反序列化使用

    1. 序列化的实现方式:java.io.ObjectOutputStream类,继承自OutputStream,将Java对象的原始数据类型写到文件,实现对象的持久化存储。

      • 构造方法:

        ObjectOutputStream(OutputStream out):创建写入指定 OutputStream 的 ObjectOutputStream

      • 序列化写出对象方法:

        public final void writeObject(Object obj):将指定的对象写入 ObjectOutputStream。

      • 序列化操作步骤:

        • 创建一个ObjectOutputStream输出流。
        • 调用ObjectOutputStream对象的writeObject输出可序列化对象。

      示例:

      import java.io.Serializable;
      
      public class Person implements Serializable{
          public static final long serialVersionUID = 1L;
          public String name;
          public int age;
      
          public Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      import java.io.*;
      
      public class TestObjectOutputStream {
          public static void main(String[] args) throws IOException {
              ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
              Person p = new Person("zhangsan", 20);
              Person p1 = new Person("lisi", 30);
      
              oos.writeObject(p);
              oos.writeObject(p1);
      
              oos.close();
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    2. 反序列化的实现方式:java.io.ObjectInputStream类,继承自InputStream,将之前使用ObjectOutputStream序列化的原始数据恢复为对象 。

      • 构造方法:

        ObjectInputStream(InputStream in):创建从指定InputStream读取的ObjectInputStream。

      • 反序列化读出对象方法:

        public final Object readObject(): 从 ObjectInputStream 读取对象。

      • 反序列化操作步骤:

        • 创建一个ObjectInputStream输入流。
        • 调用ObjectInputStream对象的readObject()得到序列化的对象。

      示例1:读取上面序列化的Person实例化对象

      import java.io.*;
      
      public class TestObjectInputStream {
          public static void main(String[] args) throws IOException,ClassNotFoundException{
              ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
      
              // 按写入的顺序读出
              Person p = (Person)ois.readObject();
              Person p1 = (Person)ois.readObject();
      
              System.out.println("name:" + p.name + ",age:" + p.age);
              System.out.println("name:" + p1.name + ",age:" + p1.age);
              ois.close();
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

      说明:

      1. 对于反序列化,在反序列化对象时候,必须是能够找到对应的class文件的类才行,如果找不到该类的class文件,则会抛出一个ClassNotFoundException

      2. 反序列化还可能出现另一个异常:InvalidClassException

        可能的原因有以下几点:

        • 该类的序列化ID与从流中读出来的序列化ID不一致(使用serialVersionUID解决)
        • 该类含有未知数据类型
        • 该类没有可访问的无参构造方法。
  • 相关阅读:
    基于51单片机的简易数字计算器Proteus仿真
    jquery 选择器深入
    中国功率半导体产业发展状况及“十四五”投资规划建议报告2022-2028年新版
    国际结算重点完整版
    机器学习(十五)异常检测
    【计算机视觉 | CNN】Image Model Blocks的常见算法介绍合集(三)
    ubuntu系统开启ssh用户名密码登录
    论坛介绍|COSCon'23 开源百宝箱(T)
    Yolov5 export.py实现onnx模型的导出
    uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程
  • 原文地址:https://blog.csdn.net/chisuisi5702/article/details/126284662