反序列化時(shí)拋出異常
拋出這個(gè)異常不知道是什么原因呀
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不一致,導(dǎo)致反序列化失敗。
當(dāng)實(shí)現(xiàn)java.io.Serializable接口的實(shí)體(類)沒有顯式地定義一個(gè)名為serialVersionUID,類型為long的變量時(shí),Java序列化機(jī)制會(huì)根據(jù)編譯的class(它通過類名,方法名等諸多因素經(jīng)過計(jì)算而得,理論上是一一映射的關(guān)系,也就是唯一的)自動(dòng)生成一個(gè)serialVersionUID作序列化版本比較用,這種情況下,如果class文件(類名,方法明等)沒有發(fā)生變化(增加空格,換行,增加注釋,等等),就算再編譯多次,serialVersionUID也不會(huì)變化的。
你的這種異常是因?yàn)樾蛄谢瘜?duì)象之后又修改了該對(duì)象(增加空格,換行,增加注釋,等等),使其編譯后的class文件發(fā)生變化,導(dǎo)致程序執(zhí)行時(shí)認(rèn)為序列化的對(duì)象和反序列化的對(duì)象不是一種對(duì)象進(jìn)而拋出異常。
如果你不希望程序因?yàn)閟erialVersionUID不同而反序列化失敗,可以在實(shí)現(xiàn)java.io.Serializable接口的實(shí)體類中顯示定義一個(gè)serialVersionUID的long常量(一般為1L),這樣反序列化時(shí)就不會(huì)檢查實(shí)體類是否改變了。
2017-05-08
怪我沒說清,這個(gè)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、對(duì)象的序列化注意student類要實(shí)現(xiàn)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();
}
}