Java序列化的原理分析及解決
概念
序列化是指將對(duì)象轉(zhuǎn)換為可傳輸格式的過(guò)程。是一種數(shù)據(jù)持久化手段。
在Java的序列化機(jī)制中,如果是String,枚舉或者是實(shí)現(xiàn)了Serializable接口的類,均可以通過(guò)Java的序列化機(jī)制,將類序列化為符合編碼的數(shù)據(jù)流,然后通過(guò)InputStream和OutputStream將內(nèi)存中的類持久化到硬盤或者網(wǎng)絡(luò)中。
Serializable 和 Externalizable 接口有何不同?
Serializable接口可序列化的所有子類型本身都是可序列化的。
如果要序列化的類有父類,要想將父類中的變量也持久化下來(lái),那么父類也應(yīng)該實(shí)現(xiàn)Serializable接口。
Externalizable繼承了Serializable,該接口定義了兩個(gè)方法,當(dāng)使用Externalizable接口來(lái)進(jìn)行序列化和反序列化時(shí)需要重寫這兩個(gè)方法,如果沒(méi)有定義具體的序列化細(xì)節(jié),那么序列化之后的對(duì)象為空。
serialVersionUID有什么用?沒(méi)定義會(huì)有什么問(wèn)題?
虛擬機(jī)是否允許反序列化,不僅取決于類路徑和功能代碼是否一致,一個(gè)非常重要的點(diǎn)是兩個(gè)類的序列化ID是否一致。也即serialVersionUID一致。
在進(jìn)行反序列化時(shí),JVM會(huì)把傳來(lái)的字節(jié)流中的seriaVersionUD與本地相應(yīng)實(shí)體類的seriaIVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就會(huì)出現(xiàn)序列化版本不一致的異常,即是InvalidCastException。這樣做是為了保證安全,因?yàn)槲募鎯?chǔ)中的內(nèi)容可能被篡改。
注意:如果在使用時(shí)不去定義SerialVersionUID,如果在序列化對(duì)象之后修改了這個(gè)類的信息(例如加一個(gè)字段)那么反序列會(huì)失敗,因?yàn)闀?huì)存在兩個(gè)不同的SerialVersionUID.
class User implements Serializable{ private String name; }
如果定義了一個(gè)上述類的對(duì)象并保存到文件中(這里沒(méi)有指定SerialVersionUID)。
然后修改這個(gè)類,增加一個(gè)屬性。
class User implements Serializable{ private String name; private int age; }
執(zhí)行反序列化時(shí)就會(huì)拋出一個(gè)InvalidClassException,并且指出兩個(gè)serialVersionUID不同。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析
這篇文章主要介紹了Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(62)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08springboot2.6.3讀取不到nacos上的配置文件問(wèn)題
這篇文章主要介紹了springboot2.6.3讀取不到nacos上的配置文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot 內(nèi)嵌 camunda的配置方法
Camunda是一個(gè)基于Java的框架,支持用于工作流和流程自動(dòng)化的BPMN、用于案例管理的CMMN和用于業(yè)務(wù)決策管理的DMN,這篇文章主要介紹了SpringBoot 內(nèi)嵌 camunda,需要的朋友可以參考下2024-06-06Java過(guò)濾器與監(jiān)聽器間區(qū)別與聯(lián)系
監(jiān)聽器是一個(gè)接口內(nèi)容由我們實(shí)現(xiàn),會(huì)在特定時(shí)間被調(diào)用,監(jiān)聽器用于監(jiān)聽web應(yīng)用中三大域?qū)ο?request,session,application),信息的創(chuàng)建,銷毀,增加,修改,刪除等動(dòng)作的發(fā)生,然后做出相應(yīng)的響應(yīng)處理2023-01-01thymeleaf實(shí)現(xiàn)前后端數(shù)據(jù)交換的示例詳解
Thymeleaf?是一款用于渲染?XML/XHTML/HTML5?內(nèi)容的模板引擎,當(dāng)通過(guò)?Web?應(yīng)用程序訪問(wèn)時(shí),Thymeleaf?會(huì)動(dòng)態(tài)地替換掉靜態(tài)內(nèi)容,使頁(yè)面動(dòng)態(tài)顯示,這篇文章主要介紹了thymeleaf實(shí)現(xiàn)前后端數(shù)據(jù)交換,需要的朋友可以參考下2022-07-07零基礎(chǔ)寫Java知乎爬蟲之獲取知乎編輯推薦內(nèi)容
上篇文章我們拿百度首頁(yè)做了個(gè)小測(cè)試,今天我們來(lái)個(gè)復(fù)雜的,直接抓取知乎編輯推薦的內(nèi)容,小伙伴們可算松了口氣,終于進(jìn)入正題了,哈哈。2014-11-11