亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

反序列化時拋出異常

拋出這個異常不知道是什么原因呀

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)


正在回答

3 回答

serialVersionUID不一致,導致反序列化失敗。

當實現java.io.Serializable接口的實體(類)沒有顯式地定義一個名為serialVersionUID,類型為long的變量時,Java序列化機制會根據編譯的class(它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的)自動生成一個serialVersionUID作序列化版本比較用,這種情況下,如果class文件(類名,方法明等)沒有發生變化(增加空格,換行,增加注釋,等等),就算再編譯多次,serialVersionUID也不會變化的。

你的這種異常是因為序列化對象之后又修改了該對象(增加空格,換行,增加注釋,等等),使其編譯后的class文件發生變化,導致程序執行時認為序列化的對象和反序列化的對象不是一種對象進而拋出異常。

如果你不希望程序因為serialVersionUID不同而反序列化失敗,可以在實現java.io.Serializable接口的實體類中顯示定義一個serialVersionUID的long常量(一般為1L),這樣反序列化時就不會檢查實體類是否改變了。

1 回復 有任何疑惑可以回復我~
#1

田同學 提問者

非常感謝!
2017-05-08 回復 有任何疑惑可以回復我~
#2

田同學 提問者

加上這個常量之后還是異常下面是我的代碼
2017-05-08 回復 有任何疑惑可以回復我~

怪我沒說清,這個long是這么定義的:

private static final long serialVersionUID = 1L;

直接定義long沒用

1 回復 有任何疑惑可以回復我~
#1

田同學 提問者

不好意思,菜鳥一枚,是我沒看懂,謝謝呀
2017-05-08 回復 有任何疑惑可以回復我~
#2

田同學 提問者

還有異常(:
2017-05-08 回復 有任何疑惑可以回復我~
#3

gkenan 回復 田同學 提問者

先把以前序列化的數據刪掉重新序列化,這時候反序列化不會出問題。如果你需要用以前序列化的數據,需要把student的 serialVersionUID 改成 -1595130985977377714,這樣才能使用舊數據。
2017-05-08 回復 有任何疑惑可以回復我~
#4

田同學 提問者 回復 gkenan

謝謝呀,明白了
2017-05-09 回復 有任何疑惑可以回復我~
查看1條回復

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

}


}


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

反序列化時拋出異常

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號