第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

反序列化時(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)


正在回答

3 回答

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í)體類是否改變了。

1 回復(fù) 有任何疑惑可以回復(fù)我~
#1

田同學(xué) 提問者

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

田同學(xué) 提問者

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

怪我沒說清,這個(gè)long是這么定義的:

private static final long serialVersionUID = 1L;

直接定義long沒用

1 回復(fù) 有任何疑惑可以回復(fù)我~
#1

田同學(xué) 提問者

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

田同學(xué) 提問者

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

gkenan 回復(fù) 田同學(xué) 提問者

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

田同學(xué) 提問者 回復(fù) gkenan

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

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

}


}


0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

反序列化時(shí)拋出異常

我要回答 關(guān)注問題
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)