什么是序列化?序列化有什么作用?
一、序列化與反序列化
序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間,對象將其當(dāng)前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。
序列化使其他代碼可以查看或修改,那些不序列化便無法訪問的對象實(shí)例數(shù)據(jù)。確切地說,代碼執(zhí)行序列化需要特殊的權(quán)限:即指定了 SerializationFormatter 標(biāo)志的 SecurityPermission。在默認(rèn)策略下,通過 Internet 下載的代碼或 Internet 代碼不會授予該權(quán)限;只有本地計(jì)算機(jī)上的代碼才被授予該權(quán)限。
通常,對象實(shí)例的所有字段都會被序列化,這意味著數(shù)據(jù)會被表示為實(shí)例的序列化數(shù)據(jù)。這樣,能夠解釋該格式的代碼有可能能夠確定這些數(shù)據(jù)的值,而不依賴于該成員的可訪問性。
類似地,反序列化從序列化的表示形式中提取數(shù)據(jù),并直接設(shè)置對象狀態(tài),這也與可訪問性規(guī)則無關(guān)。
對于任何可能包含重要的安全性數(shù)據(jù)的對象,如果可能,應(yīng)該使該對象不可序列化。如果它必須為可序列化的,請嘗試生成特定字段來保存不可序列化的重要數(shù)據(jù)。如果無法實(shí)現(xiàn)這一點(diǎn),則應(yīng)注意該數(shù)據(jù)會被公開給任何擁有序列化權(quán)限的代碼,并確保不讓任何惡意代碼獲得該權(quán)限。
------------------------- 百度百科上面的解釋
我覺得挺好的,我看了很多篇博客,都說的模棱兩可,說指堆內(nèi)存中的java對象數(shù)據(jù),通過某種方式把對象存儲到磁盤文件中,或者傳遞給其他網(wǎng)絡(luò)節(jié)點(diǎn)(網(wǎng)絡(luò)傳輸)。
說序列化就是把對象存儲到磁盤中,我認(rèn)為這種應(yīng)該叫做數(shù)據(jù)持久化,不是叫做序列化。 java對象不能直接存儲到磁盤中,或不能直接在網(wǎng)絡(luò)上傳輸,需要轉(zhuǎn)化成另一種格式才能,而序列化就是把java對象轉(zhuǎn)化成一種格式的過程,把java對象序列化,變成一種可以存儲的形式。
序列化的作用:
1:對象隨著程序的運(yùn)行而被創(chuàng)建,然后在不可達(dá)時被回收,生命周期是短暫的。但是如果我們想長久地把對象的內(nèi)容保存起來怎么辦呢?把它轉(zhuǎn)化為字節(jié)序列保存在存儲介質(zhì)上即可。那就需要序列化。
2:所有可在網(wǎng)絡(luò)上傳輸?shù)膶ο蠖急仨毷强尚蛄谢?,比如RMI(remote method invoke,即遠(yuǎn)程方法調(diào)用),傳入的參數(shù)或返回的對象都是可序列化的,否則會出錯;所有需要保存到磁盤的java對象都必須是可序列化的。通常建議:程序創(chuàng)建的每個JavaBean類都實(shí)現(xiàn)Serializeable接口
3:進(jìn)程間傳遞對象,Android是基于Linux系統(tǒng),不同進(jìn)程之間的java對象是無法傳輸,所以我們此處要對對象進(jìn)行序列化,從而實(shí)現(xiàn)對象在 應(yīng)用程序進(jìn)程 和 ActivityManagerService進(jìn)程 之間傳輸。
序列化的實(shí)現(xiàn):
1:實(shí)現(xiàn)Sericalizable接口,實(shí)現(xiàn)Sericalizable接口的時候還要寫一個SericalizableUID,這個是版本號,JVM會把傳進(jìn)來的字節(jié)流中的serialVersionUID與本地實(shí)體類中的serialVersionUID進(jìn)行比較,如果相同則認(rèn)為是一致的,便可以進(jìn)行反序列化,否則就會報序列化版本不一致的異常。如果實(shí)現(xiàn)接口的時候,沒有給定UID,就會使用默認(rèn)的UID,當(dāng)使用默認(rèn)的UID的時候,jvm每次編譯的時候會生成一個UID,當(dāng)后面程序改了一些代碼,再次編譯的時候會生成不同的UID,會導(dǎo)致反序列化失??!所以在實(shí)現(xiàn)Sericalizable接口的時候,我們自己給定一個固定的UID值,這樣就能保證編譯完再 反序列化的時候的版本一致性。所以j能不能成功反序列化,就是看對象中的UID和實(shí)體中UID是否一致。
2:實(shí)現(xiàn)Externalnalizable接口,在類中實(shí)現(xiàn)readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,在方法中定義類對象自定義的序列化和反序列化操作。這樣通過對象輸出流和對象輸入流的輸入輸出方法序列化和反序列化對象時會自動調(diào)用類中定義的readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法。
對象的實(shí)現(xiàn)序列順序:
當(dāng)前類描述的元數(shù)據(jù)輸出為字節(jié)序列;【類定義描述、類中屬性定義描述】
超類描述輸出為字節(jié)序列;【如果超類還有超類,則依次遞歸,直至沒有超類】
從最頂層超類往下,依次輸出各類屬性值描述,直至當(dāng)前類對象屬性值。
即:從下到上描述類定義,從上往下輸出屬性值。
當(dāng)靜態(tài)變量和transient關(guān)鍵字修飾的變量不能被序列化;
反序列化時要按照序列化的順序重構(gòu)對象:如先序列化A后序列化B,則反序列化時也要先獲取A后獲取B,否則報錯。
序列化漏洞:
反序列化是一系列安全問題的根源:攻擊者能夠?qū)阂鈹?shù)據(jù)序列化并存儲到數(shù)據(jù)庫或內(nèi)存中,當(dāng)應(yīng)用進(jìn)行反序列化時,應(yīng)用會執(zhí)行到惡意代碼。
在谷歌內(nèi)部,這個缺陷被稱為“瘋狂的小部件 (Mad Gadget)”,外界對它的叫法是 “Java 啟示錄 (Apocalypse)”。
所以有一系列的規(guī)范來大化避免:
1)對序列化對象執(zhí)行完整性檢查或加密,以防止惡意對象創(chuàng)建或數(shù)據(jù)篡改;最常見的例子之一就是JWT:JWT由3部分組成:Header,Payload,Verify Signature,最后的簽名部分其實(shí)就是對數(shù)據(jù)進(jìn)行完整性校驗(yàn)的關(guān)鍵部分,用secret對數(shù)據(jù)部分進(jìn)行哈希計(jì)算,隨后檢查計(jì)算出來的哈希值是否和請求中的JWT簽名部分的哈希值相同。若兩者一致則認(rèn)為數(shù)據(jù)完整性沒有被破壞,若兩者有差異則說明數(shù)據(jù)被修改過。
2)在創(chuàng)建對象之前強(qiáng)制執(zhí)行嚴(yán)格的類型約束;
3)隔離反序列化的代碼,使其在非常低的特權(quán)環(huán)境中運(yùn)行;
4)記錄反序列化的例外情況和失敗信息,如:傳入的類型不是預(yù)期的類型,或者反序列處理引發(fā)的例外情況;
5)限制或監(jiān)視來自于容器或服務(wù)器傳入和傳出的反序列化網(wǎng)絡(luò)連接;
6)監(jiān)視反序列化,當(dāng)用戶持續(xù)進(jìn)行反序列化時,對用戶進(jìn)行警告。
目前JAVA常用的序列化有protobuf,json,xml,Serializable,hessian,kryo。
protobuf:谷歌公司出的一款開源項(xiàng)目,轉(zhuǎn)碼性能高,支持多語言;
JSON:用途最廣泛,序列化方式還衍生了阿里的fastjson,美團(tuán)的MSON,谷歌的GSON等更加優(yōu)秀的轉(zhuǎn)碼工具。
優(yōu)點(diǎn):使用方便。
缺點(diǎn):數(shù)據(jù)冗長,轉(zhuǎn)碼性能一般。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章題目:Java中的序列化-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article10/degjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、企業(yè)建站、品牌網(wǎng)站制作、服務(wù)器托管、面包屑導(dǎo)航、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容