反序列化時拋出異常
拋出這個異常不知道是什么原因呀
Exception in thread "main" java.io.InvalidClassException: com.imooc.file.Student; local class incompatible: stream classdesc serialVersionUID = -1595130985977377714, local class serialVersionUID = -6276597220496795978
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.imooc.file.ObjectSerialDemo.main(ObjectSerialDemo.java:21)
2017-05-07
serialVersionUID不一致,導致反序列化失敗。
當實現java.io.Serializable接口的實體(類)沒有顯式地定義一個名為serialVersionUID,類型為long的變量時,Java序列化機制會根據編譯的class(它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的)自動生成一個serialVersionUID作序列化版本比較用,這種情況下,如果class文件(類名,方法明等)沒有發生變化(增加空格,換行,增加注釋,等等),就算再編譯多次,serialVersionUID也不會變化的。
你的這種異常是因為序列化對象之后又修改了該對象(增加空格,換行,增加注釋,等等),使其編譯后的class文件發生變化,導致程序執行時認為序列化的對象和反序列化的對象不是一種對象進而拋出異常。
如果你不希望程序因為serialVersionUID不同而反序列化失敗,可以在實現java.io.Serializable接口的實體類中顯示定義一個serialVersionUID的long常量(一般為1L),這樣反序列化時就不會檢查實體類是否改變了。
2017-05-08
怪我沒說清,這個long是這么定義的:
private static final long serialVersionUID = 1L;
直接定義long沒用
2017-05-08
package com.imooc.file;
import java.io.Serializable;
public class Student implements Serializable {
private String stuno;
private String stuname;
private int stuage;
long serialVersionUID = 1L;
public Student(){
}
public Student(String stuno, String stuname, int stuage) {
super();
this.stuno = stuno;
this.stuname = stuname;
this.stuage = stuage;
}
public String getStuno() {
return stuno;
}
public void setStuno(String stuno) {
this.stuno = stuno;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public int getStuage() {
return stuage;
}
public void setStuage(int stuage) {
this.stuage = stuage;
}
@Override
public String toString() {
return?
"Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
}
}
package com.imooc.file;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
public class ObjectSerialDemo {
public static void main(String[] args)throws Exception{
String file = "demo/obj.dat";
//1、對象的序列化注意student類要實現serializable接口
/*ObjectOutputStream oos =?
new ObjectOutputStream(new FileOutputStream(file));
Student stu = new Student("10001","張三",20);
oos.writeObject(stu);
oos.flush();
oos.close();*/
//反序列化
ObjectInputStream ois = new?
ObjectInputStream(new FileInputStream(file));
Student stu = (Student)ois.readObject();
System.out.print(stu);
ois.close();
}
}