關(guān)于Java實(shí)體類Serializable序列化接口的作用和必要性解析
在Java Web編程中,很多實(shí)體類會(huì)實(shí)現(xiàn)Serializable 接口,但是很多實(shí)體在使用中并沒有序列化也能正常使用。
定義:把對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化
把字節(jié)序列恢復(fù)為對(duì)象的過程稱為對(duì)象的反序列化
那么Serializable 接口有什么作用呢?
Serializable作為序列化的一種方式。
序列化可以理解為一種機(jī)制,按照一定的格式將Java 對(duì)象的某種狀態(tài)轉(zhuǎn)成介質(zhì)可以接受的形式,以便存儲(chǔ)或傳輸。
序列化實(shí)現(xiàn)將Java 對(duì)象相關(guān)的類信息、屬性及屬性值等等保存起來,便于存儲(chǔ)和傳輸。
序列化的作用可以總結(jié)以下:
(1)提供一種簡(jiǎn)單又可拓展的對(duì)象保存恢復(fù)機(jī)制
(2)對(duì)于遠(yuǎn)程調(diào)用,能方便對(duì)對(duì)象進(jìn)行編碼和解碼,就像實(shí)現(xiàn)對(duì)象直接傳輸
(3)可以將對(duì)象持久化到介質(zhì)中,就像實(shí)現(xiàn)對(duì)對(duì)象直接存儲(chǔ)。
(4)允許對(duì)象自定義外部存儲(chǔ)的格式。
序列化的簡(jiǎn)單理解方式:
序列化的過程,就是一個(gè)“freeze”的過程,它將一個(gè)對(duì)象freeze(冷凍)住,然后進(jìn)行存儲(chǔ),等到再次需要的時(shí)候,再將這個(gè)對(duì)象de-freeze就可以立即使用。我們以為的沒有進(jìn)行序列化,其實(shí)是在聲明的各個(gè)不同變量的時(shí)候,由具體的數(shù)據(jù)類型幫助我們實(shí)現(xiàn)了序列化操作。如果有人打開過Serializable接口的源碼,就會(huì)發(fā)現(xiàn),這個(gè)接口其實(shí)是個(gè)空接口,那么這個(gè)序列化操作,到底是由誰去實(shí)現(xiàn)了呢?其實(shí),看一下接口的注釋說明就知道,當(dāng)我們讓實(shí)體類實(shí)現(xiàn)Serializable接口時(shí),其實(shí)是在告訴JVM此類可被序列化,可被默認(rèn)的序列化機(jī)制序列化。
例子:
@Data @ToString public class UserRole implements Serializable { private static final long serialVersionUID = -6056129805075132981L; private int id; private int user_id; private int role_id; }
一個(gè)實(shí)體類User實(shí)現(xiàn)Serializable接口,并且定義了serialVersionUID變量。
serialVersionUID是用來輔助對(duì)象的序列化與反序列化的,原則上序列化后的數(shù)據(jù)當(dāng)中的serialVersionUID與當(dāng)前類當(dāng)中的serialVersionUID一致,那么該對(duì)象才能被反序列化成功。
工作機(jī)制:在序列化的時(shí)候系統(tǒng)將serialVersionUID寫入到序列化的文件中去,當(dāng)反序列化的時(shí)候系統(tǒng)會(huì)先去檢測(cè)文件中的serialVersionUID是否跟當(dāng)前的文件的serialVersionUID是否一致,如果一直則反序列化成功,否則就說明當(dāng)前類跟序列化后的類發(fā)生了變化。
到此這篇關(guān)于關(guān)于Java實(shí)體類Serializable序列化接口的作用和必要性解析的文章就介紹到這了,更多相關(guān)Java序列化接口Serializable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven本地倉(cāng)庫(kù)的配置以及修改默認(rèn).m2倉(cāng)庫(kù)位置
今天小編就為大家分享一篇關(guān)于Maven本地倉(cāng)庫(kù)的配置以及修改默認(rèn).m2倉(cāng)庫(kù)位置的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制
這篇文章主要介紹了關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制,ArrayList底層是基于數(shù)組實(shí)現(xiàn)的,是一個(gè)動(dòng)態(tài)數(shù)組,自動(dòng)擴(kuò)容,不是線程安全的,只能用在單線程環(huán)境下,需要的朋友可以參考下2023-05-05Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待
這篇文章主要介紹了Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10SpringBoot實(shí)現(xiàn)前端驗(yàn)證碼圖片生成和校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)前端驗(yàn)證碼圖片生成和校驗(yàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02