色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Java對(duì)象序列化為什么要使用SerialversionUID

瀏覽:102日期:2022-08-21 14:11:59

1、首先談?wù)劄槭裁匆蛄谢瘜?duì)象

- 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。- 把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化。

對(duì)象的序列化主要有兩種用途:1) 把對(duì)象的字節(jié)序列永久地保存到硬盤上,通常存放在一個(gè)文件中;2) 在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。

在很多應(yīng)用中,需要對(duì)某些對(duì)象進(jìn)行序列化,讓它們離開內(nèi)存空間,入住物理硬盤,以便長(zhǎng)期保存。比如最常見的是Web服務(wù)器中的Session對(duì)象,當(dāng)有 10萬(wàn)用戶并發(fā)訪問(wèn),就有可能出現(xiàn)10萬(wàn)個(gè)Session對(duì)象,內(nèi)存可能吃不消,于是Web容器就會(huì)把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對(duì)象還原到內(nèi)存中。

當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象

2、為什么要使用SerialversionUID呢

簡(jiǎn)單看一下 Serializable接口的說(shuō)明

If a serializable class does not explicitly declare a serialVersionUID,then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification.

如果用戶沒有自己聲明一個(gè)serialVersionUID,接口會(huì)默認(rèn)生成一個(gè)serialVersionUIDHowever, it is stronglyrecommended that all serializable classes explicitly declareserialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpectedInvalidClassExceptions during deserialization.但是強(qiáng)烈建議用戶自定義一個(gè)serialVersionUID,因?yàn)槟J(rèn)的serialVersinUID對(duì)于class的細(xì)節(jié)非常敏感,反序列化時(shí)可能會(huì)導(dǎo)致InvalidClassException這個(gè)異常。e.g:1.使用默認(rèn)的serialVersionUID

我們先建一個(gè)實(shí)體類Person 實(shí)現(xiàn)Serializable接口

public class Person implements Serializable { private int age; private String name; private String sex; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}

然后去序列化和反序列化它

public class Person implements Serializable { private int age; private String name; private String sex; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}

結(jié)果如圖

詳解Java對(duì)象序列化為什么要使用SerialversionUID

e.g:2如果我們先盡心序列化,然后在反序列化之前修改了Person類會(huì)怎樣呢

public class Person implements Serializable { private int age; private String name; private String sex; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}

運(yùn)行結(jié)果

詳解Java對(duì)象序列化為什么要使用SerialversionUID 

 可以看到,當(dāng)我們修改Person類的時(shí)候,Person類對(duì)應(yīng)的SerialversionUID也變化了,而序列化和反序列化就是通過(guò)對(duì)比其SerialversionUID來(lái)進(jìn)行的,一旦SerialversionUID不匹配,反序列化就無(wú)法成功。在實(shí)際的生產(chǎn)環(huán)境中,我們可能會(huì)建一系列的中間Object來(lái)反序列化我們的pojo,為了解決這個(gè)問(wèn)題,我們就需要在實(shí)體類中自定義SerialversionUID。e.g:3 在Person類中加入自定義SerialversionUID

public class Person implements Serializable { private static final long serialVersionUID = -5809782578272943999L; private int age; private String name; private String sex; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}

不管我們序列化之后如何更改我們的Person(不刪除原有字段),最終都可以反序列化成功。

到此這篇關(guān)于詳解Java對(duì)象序列化為什么要使用SerialversionUID的文章就介紹到這了,更多相關(guān)Java對(duì)象序列化SerialversionUID內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 天天躁日日躁狠狠躁一级毛片 | 国产欧美精品一区二区 | 成年人三级视频 | 一级片a级片| 日本一区不卡视频 | 亚洲人成在线观看 | 免费在线观看的毛片 | 免费人成观看在线网 | 精品国产香蕉在线播出 | 国产丶欧美丶日韩丶不卡影视 | 欧美大尺度免费一级特黄 | 久草视频在线免费播放 | 亚洲欧洲eeea在线观看 | 99精选视频| 色偷偷亚洲第一成人综合网址 | 亚洲成a人片毛片在线 | 女高中生被cao到哭视频 | 欧美精品做人一级爱免费 | 国产三级成人 | 特级做a爰片毛片免费看一区 | 中文字幕中文字幕在线 | 精品久久久久中文字幕日本 | 香蕉久久夜色精品国产2020 | h亚洲| 亚洲乱人伦精品图片 | 一级毛片视频在线 | 精品一区二区三区中文 | 窝窝女人体国产午夜视频 | 国产一级做a爰片久久毛片男 | 久草视频免费在线观看 | chinese宾馆自拍hd| 欧美另类videosbestsex高清 | 精品国产一区二区二三区在线观看 | 久久精品视| 国产欧美日韩不卡在线播放在线 | 在线日本看片免费人成视久网 | 九九精品免费视频 | 国产成人无精品久久久 | 久久网免费 | 女人扒开双腿让男人捅 | 亚洲男人天堂2018 |