2021-8-2序列化和反序列化复习

序列化与反序列化

序列化是指将对象的状态信息转换为可以存储或传输形式的过程,在序列化期间,对象将其当前状态写到临时或持久性存储区,以后可以通过从存储区读取或者反序列化对象的状态,重新创建该对象!

序列化,利用ObjectOutputStream,对象的信息,按照固定格式转换成一串字节值输出并持久保存到磁盘

反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象

特点

  1. 需要序列化的文件必须实现Serializable接口,用来启用序列化功能
  2. 不需要序列化的数据可以修饰成static,原因:static资源属于类资源,不随着对象被序列化输出
  3. 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
  4. 在反序列化时候,如果和序列化的版本号不一致,无法完成反序列化
  5. 常用与服务器之间的数据传输,序列化成文件,反序列化读取数据
  6. 常用使用套接字流在主机之间传递对象
  7. 不需要序列化的数据也可以修饰成transient,只在程序运行期间在内存中存在,不会被序列化持久保存

序列化:ObjectOutputStream

构造方法:
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream
普通方法:
writeObject(Object obj)
将指定的对象写入 ObjectOutputStream
 

反序列化:ObjectInputStream

构造方法:
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
普通方法:
readObject() 从 ObjectInputStream 读取对象

package cn.tedu.test1;

import java.io.Serializable;

public class Student implements Serializable {
    private static final long serialVersionUID = 2964503584901399973L;
    private String name;//姓名
    private int age;//年龄
    private String addr;//地址
    private char gender;//性别

    public Student() {
        System.out.println("我是Student的无参构造");
    }

    public Student(String name, int age, String addr, char gender) {
        this.name = name;
        this.age = age;
        this.addr = addr;
        this.gender = gender;
        System.out.println("我是Student的有参构造");
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", addr='" + addr + '\'' +
                ", gender=" + gender +
                '}';
    }
}


package cn.tedu.test1;

import java.io.*;

public class XuLie {
    public static void main(String[] args) {
        ObjectOutputStream objectOutputStream=null;
        ObjectInputStream objectInputStream=null;
        try {
            objectOutputStream= new ObjectOutputStream(new FileOutputStream("D://ready//1.txt"));
            Student student = new Student("韩云", 20, "地狱", '男');
            objectOutputStream.writeObject(student);
            objectInputStream=new ObjectInputStream(new FileInputStream("D://ready/1.txt"));
            Object o = objectInputStream.readObject();
            System.out.println(o);
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            try {
                objectInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                objectOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

测试报错NotSerializableException:要序列化对象所在的类并没有实现序列化接口

测试报错InvalidClassException:本次反序列化时使用的UID与序列化时的UID不匹配

上一篇:Spring Cloud Feign(服务调用)


下一篇:北汽极狐ARCFOX与华为合作