java.io.InvalidClassException异常的解决办法
当序列化运行时检测到类中的以下问题之一时抛出。一共有三种会产生异常的问题和解决办法:类的串行版本与从流中读取的类描述符的类型不匹配解决办法:serialVersionUID 是 序列号如果我们自己没有定义,那么虚拟机会根据类中的信息会自动的计算出一个序列号。不让虚拟机帮我们自动计算,我们自己手动给出serialVersionUID,而且这个值不要变。给对象所属的类加一个下面的代码private s
·
当序列化运行时检测到类中的以下问题之一时抛出。
一共有三种会产生异常的问题和解决办法:
- 类的串行版本与从流中读取的类描述符的类型不匹配
解决办法:serialVersionUID 是 序列号
如果我们自己没有定义,那么虚拟机会根据类中的信息会自动的计算出一个序列号。
不让虚拟机帮我们自动计算,我们自己手动给出serialVersionUID,而且这个值不要变。
给对象所属的类加一个下面的代码
private static final long serialVersionUID = 1L;
不要超过long的取值范围,随便写多少都行。 - 实体类
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
// private int age;
private transient int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.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 class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// write();
read();
}
//反序列化
private static void read() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myOtherStream\\oos.txt"));
Object obj = ois.readObject();
Student s = (Student) obj;
System.out.println(s.getName() + "," + s.getAge());
ois.close();
}
//序列化
private static void write() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myOtherStream\\oos.txt"));
Student s = new Student("佟丽娅", 30);
oos.writeObject(s);
oos.close();
}
}
-
该类包含未知的数据类型
解决办法:检查数据类型是否定义。 -
该类没有可访问的无参数构造函数
解决办法:重新在实体类中创建一个无参构造
更多推荐
所有评论(0)