摘要:前言什么是序列化將對(duì)象編碼成一個(gè)字節(jié)流,這樣一來(lái)就可以在通信中傳遞對(duì)象了。比如在一臺(tái)虛擬機(jī)中被傳遞到另一臺(tái)虛擬機(jī)中,或者字節(jié)流存儲(chǔ)到磁盤上。比如增加一個(gè)不是很重要的工具方法,自動(dòng)產(chǎn)生的序列版本也會(huì)發(fā)生變化,則會(huì)出現(xiàn)序列版本不一致的情況。
前言
什么是序列化:將對(duì)象編碼成一個(gè)字節(jié)流,這樣一來(lái)就可以在通信中傳遞對(duì)象了。比如在一臺(tái)虛擬機(jī)中被傳遞到另一臺(tái)虛擬機(jī)中,或者字節(jié)流存儲(chǔ)到磁盤上。
“關(guān)于Java的序列化,無(wú)非就是簡(jiǎn)單的實(shí)現(xiàn)Serializable接口”這樣的說(shuō)法只能說(shuō)明停留在會(huì)用的階段,而我們想要走的更遠(yuǎn)往往就需要了解更多的東西,比如:為什么要實(shí)現(xiàn)序列化?序列化對(duì)程序的安全性有啥影響?如何避免多余的序列化?.....
本文主要參考資料《Effective Java》,其中代碼除了只作部分說(shuō)明,不能運(yùn)行外,剩余代碼都是親自實(shí)踐過(guò)的!
一、序列化代價(jià)
雖然實(shí)現(xiàn)Serializable很簡(jiǎn)單,但是為了序列化而付出的長(zhǎng)期開(kāi)銷往往是實(shí)實(shí)在在的。實(shí)現(xiàn)Serializable接口而付出的最大代價(jià)是,一旦一個(gè)類被發(fā)布,就大大降低了“改變這個(gè)類的實(shí)現(xiàn)”的靈活性。
問(wèn):這個(gè)靈活性具體是指什么呢?
即一旦類實(shí)現(xiàn)了Serializable接口,并且這個(gè)類被廣泛地使用,往往必須永遠(yuǎn)支持這種序列化形式,如果使用默認(rèn)的序列化形式,那么這種序列化形式將永遠(yuǎn)地束縛在該類最初的內(nèi)部表示法上,換句話說(shuō),一旦接受了默認(rèn)的序列化形式,這個(gè)類中私有的和包級(jí)私有的實(shí)例域都變成導(dǎo)出的API的一部分,這顯然是不符合的。這也就是實(shí)現(xiàn)序列化往往需要考慮到的幾個(gè)代價(jià),具體請(qǐng)往下看!
1、可能會(huì)導(dǎo)致InvalidClassException異常
如果沒(méi)有顯式聲明序列版本UID,對(duì)對(duì)象的需求進(jìn)行了改動(dòng),那么兼容性將會(huì)遭到破壞,在運(yùn)行時(shí)導(dǎo)致InvalidClassException。比如:增加一個(gè)不是很重要的工具方法,自動(dòng)產(chǎn)生的序列版本UID也會(huì)發(fā)生變化,則會(huì)出現(xiàn)序列版本UID不一致的情況。所以最好還是顯式的增加序列版本號(hào)UID。
對(duì)User JavaBean實(shí)現(xiàn)Serializable接口,增加固定的序列版本號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74172.html
摘要:本文已收錄修煉內(nèi)功躍遷之路的為解決空的問(wèn)題帶來(lái)了很多新思路,查看源碼,實(shí)現(xiàn)非常簡(jiǎn)單,邏輯也并不復(fù)雜。 本文已收錄【修煉內(nèi)功】躍遷之路 showImg(https://segmentfault.com/img/bVbrCvp?w=852&h=480); Java8的Optional為解決空的問(wèn)題帶來(lái)了很多新思路,查看Optional源碼,實(shí)現(xiàn)非常簡(jiǎn)單,邏輯也并不復(fù)雜。Stuart Ma...
摘要:導(dǎo)讀閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對(duì)比自身,對(duì)自己進(jìn)行查漏補(bǔ)缺,覺(jué)得本文對(duì)你有幫助的話,可以點(diǎn)贊關(guān)注一下。目錄一基礎(chǔ)篇二進(jìn)階篇三高級(jí)篇四架構(gòu)篇五擴(kuò) 導(dǎo)讀:閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對(duì)比自身,對(duì)自己...
摘要:事實(shí)上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。中可以通過(guò)設(shè)值注入方法注入和構(gòu)造器注入實(shí)現(xiàn),推薦使用的方式為設(shè)值注入。 寫在前面 春天來(lái)了,萬(wàn)物復(fù)蘇的季節(jié)到了. 許多程序猿安奈不住生理需求,我要漲工資,我要跳槽. 畢竟金三銀四嘛. 那么要從眾多的面試者中獲得求職機(jī)會(huì),我們就要面對(duì)很多的面試題. 程序猿是最煩面試題的.面試的公司也煩,面試的人也煩. 但是沒(méi)辦法.面試的人魚龍混...
摘要:在我的理解里,定向是這樣的中的定向表示了在跨進(jìn)程通信中數(shù)據(jù)的流向,其中表示數(shù)據(jù)只能由客戶端流向服務(wù)端,表示數(shù)據(jù)只能由服務(wù)端流向客戶端,而則表示數(shù)據(jù)可在服務(wù)端與客戶端之間雙向流通。一類是用來(lái)定義方法接口,以供系統(tǒng)使用來(lái)完成跨進(jìn)程通信的。 正文 1,概述 AIDL是一個(gè)縮寫,全稱是Android Interface Definition Language,也就是Android接口定義語(yǔ)言。...
摘要:本章中的大部分內(nèi)容適用于構(gòu)造函數(shù)和方法。第項(xiàng)其他方法優(yōu)先于序列化第項(xiàng)謹(jǐn)慎地實(shí)現(xiàn)接口第項(xiàng)考慮使用自定義的序列化形式第項(xiàng)保護(hù)性地編寫方法第項(xiàng)對(duì)于實(shí)例控制,枚舉類型優(yōu)先于第項(xiàng)考慮用序列化代理代替序列化實(shí)例附錄與第版中項(xiàng)目的對(duì)應(yīng)關(guān)系參考文獻(xiàn) effective-java-third-edition 介紹 Effective Java 第三版全文翻譯,純屬個(gè)人業(yè)余翻譯,不合理的地方,望指正,感激...
閱讀 2226·2021-11-22 13:54
閱讀 3384·2019-08-29 12:25
閱讀 3448·2019-08-28 18:29
閱讀 3594·2019-08-26 13:40
閱讀 3284·2019-08-26 13:32
閱讀 970·2019-08-26 11:44
閱讀 2238·2019-08-23 17:04
閱讀 2979·2019-08-23 17:02