InvalidClassException异常_原理和解决方案和练习_序列化集合

InvalidClassException异常_原理和解决方案

当JVM反序列化对象的时候,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException异常。发生这个异常的原因如下
该类的序列版本号与从流中读取的类描述符的版本号不匹配
该类包含未知的数据类型
该类没有可访问的无惨构造方法
Serializable接口给需要序列化的类,提供了一个序列版本号。serialVersionUID该版本号的目的在于验证序列化的对象和对象类是否版本匹配
代码:

package com.yang.Test.ObjectStreamStudy;

import java.io.Serializable;


public class Person implements Serializable {
    private static final long serialVersionUID = 42L;
    private  String name;
    private int age;

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

    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 Person() {
    }

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



public class ObjectOutputStreamStudy {
    public static void main(String[] args) throws IOException {
        //1.创建ObjectOutputStream对象构造方法中传递字节输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Document\\Person.txt"));
        //2.使用ObjectOutputStream对象中的方法writeObject吧对象写入到文件中
        oos.writeObject(new Person("小美女",18));
        //3.释放资源
        oos.close();
    }
}

public class ObjectInputStreamStudy {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Document\\Person.txt"));

        Person p = (Person) ois.readObject();

        System.out.println(p.toString());

        ois.close();
    }
}

练习_序列化集合

1.将存有多个自动以对象的及和序列化操作,保存到list.txt文件中。
2.反序列化list.txt,并遍历集合打印对象信息
案例分析:
1.把若干个学生对象保存到集合中
2.把集合序列化
3.反序列化读取的时候,只需要读取一次,转换为集合类型
4.遍历集合,可以打印所有学生信息

案例实现:

package com.yang.Test.ObjectStreamStudy;

import java.io.*;
import java.util.ArrayList;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.定义一个存储Person对象的ArrayList集合
        ArrayList<Person> list = new ArrayList<>();
        //2.往ArrayList集合中存储Person对象
        list.add(new Person("张三",18));
        list.add(new Person("李四",19));
        list.add(new Person("王五",20));

        //3.创建一个序列化流ObjectOutputStream对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Document\\list.txt"));
        //4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
        oos.writeObject(list);
        //5.创建一个反序列化对象ObjectInputStream堆集合进行反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Document\\list.txt"));
        //6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
        Object o = ois.readObject();
        //7.=把Object类型的集合转换为ArrayList类型
        ArrayList<Person> newList = (ArrayList<Person>) o;
        //8.遍历集合
        newList.forEach(person -> System.out.println(person));



        ois.close();
        oos.close();
    }
}

posted @ 2022-07-19 09:08  我滴妈老弟  阅读(307)  评论(0编辑  收藏  举报