对象输入输出流(ObjectInpuStream、ObjectOutputStream)、序列化和反序列化

版权声明:ssupdding https://blog.csdn.net/sspudding/article/details/88828655

一、序列化与反序列化

1、基本概念

将对象转化为字节的过程称之为序列化
将字节转化为对象的过程称之为反序列化

transient:序列化中使用的关键字
作用是控制的变量不参与序列化,在变量前添加该关键字,序列化过程中该变量不会写入反序列化过程,该变量给定其初始值
在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

2、作用

  • 对象存储到本地磁盘需要序列化
  • 数据在网络中传输也需要序列化

3、serialVersionUID(串行化版本统一标识符)

​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量

  • 作用
    用来表明类的不同版本间的兼容性。

  • 生成方式

    • 默认的(UID的默认值依赖JAVA编译器,对同一个类,不同编译器编译可能导致UID不同)
    • 根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
  • 显式定义UID的作用

    • 确保不同版本有不同的UID
    • 序列化一个类实例,更改一个字段或者添加一个字段,不设置UID,任何更改导致无法反序列化实例,并抛出异常。
      如果添加UID,反序列化旧实例,新增加或者更改字段被设为初始值,对象为null

注意: 在JAVA中,只有类实现了java.io.Serializable接口,才能进行序列化

因为看到说对象的序列化和反序列化需要通过ObjectInputStream和ObjectOutputStream进行操作,所以我就再研究了一下这两流

二、对象输入输出流

对象的输入输出流主要的作用是用于写入对象信息与读取对象信息。

对象的输出流: ObjectOutputStream
对象的输入流: ObjectInputStream

对象的输出流将指定的对象写入到文件的过程,就是将对象序列化的过程。
对象的输入流将指定序列化好的文件读出来的过程,就是对象反序列化的过程。

使用示例

先将Person类序列化,所以要实现Serializable接口

class Person implements Serializable {

    private int age;
    private String name;
    private boolean sex;
    

    public Person(String name,int age,boolean sex){
        this.name = name;
        this.age = age;
        this.sex = sex;

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                '}';
    }

}
public class ObjectDemo {

    ////将对象的信息写到硬盘上---->对象的序列化
    public static void write(String path) throws IOException {
        FileOutputStream fileOutput = new FileOutputStream(path);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutput);

        Person person = new Person("张三",18,"男");
        objectOutputStream.writeObject(person); //将对象写入文件

        objectOutputStream.close();
    }

    //把文件中的对象信息读取出来---->对象的反序列化
    public static void read(String path) throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(path);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Person person = (Person)objectInputStream.readObject();
        System.out.println(person);
    }


    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String path = "C:\\Users\\lo\\Desktop\\ss.txt";
        write(path);
        read(path);
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sspudding/article/details/88828655