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();
}
}