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