對象的序列化與反序列化_第1頁
對象的序列化與反序列化_第2頁
對象的序列化與反序列化_第3頁
對象的序列化與反序列化_第4頁
對象的序列化與反序列化_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

對象的序列化與反序列化第1頁,課件共16頁,創(chuàng)作于2023年2月本章內(nèi)容對象序列化與反序列化的基本概念實現(xiàn)序列化的基本過程

Serializable和Externalizable接口ObjectOutputStream和ObjectInputStream自定義序列化的兩種方式默認(rèn)序列化方式與自定義序列化方式的比較序列化類不同版本的序列化兼容性第2頁,課件共16頁,創(chuàng)作于2023年2月對象序列化對象序列化:將Java對象轉(zhuǎn)化成二進(jìn)制字節(jié)流的過程。對象反序列化:將二進(jìn)制字節(jié)流恢復(fù)為Java對象的過程。對象序列化的主要用途:將對象的字節(jié)序列永久的保存到硬盤上,通常存放在一個文件中。(2)在網(wǎng)絡(luò)中傳輸對象的字節(jié)序列。第3頁,課件共16頁,創(chuàng)作于2023年2月Serializable和Externalizable接口序列化的過程:只有實現(xiàn)了Serializable和Externalizable接口的類的對象才能進(jìn)行序列化操作。Externalizable接口繼承自Serializable口,實現(xiàn)Externalizable接口的類需要自行控制序列化的行為。實現(xiàn)Serializable接口的類采用默認(rèn)的序列化方式。JDK類庫中的部分類(String,封裝類和Date類等)都實現(xiàn)了Serializable接口。第4頁,課件共16頁,創(chuàng)作于2023年2月ObjectInputStream和ObjectOutputStream(2)對象輸入和輸出流構(gòu)造方法:ObjectInputStream(InputStreamin)ObjectOutputStream(OutputStreamout)見源文件:ObjectSerTest.java第5頁,課件共16頁,創(chuàng)作于2023年2月ObjectInputStreamObjectInputStream按照默認(rèn)方式進(jìn)行反序列化時,具有以下特點:(1)如果內(nèi)存中對象所屬的類還沒有加載,那么會加載并初始化這個類。如果在classpath中找不到相應(yīng)的類文件,拋出ClassNotFoundException。(2)在反序列化時不會調(diào)用類的任何構(gòu)造方法。第6頁,課件共16頁,創(chuàng)作于2023年2月對象序列化注意的問題:(1)序列化和反序列化的順序要一致

(2)保存對象的文件名一般不要用.txt文件,換成.obj或.ser文件最好第7頁,課件共16頁,創(chuàng)作于2023年2月對象序列化ObjectOutputStream只能對實現(xiàn)了Serializable接口的類的對象進(jìn)行默認(rèn)的序列化操作,這種操作僅僅為對象的非transient和非static的實例變量進(jìn)行序列化。見源文件:ObjectSerTest1.java

注意:靜態(tài)變量屬于類,不屬于對象。靜態(tài)變量在類加載的時候初始化,將含有靜態(tài)變量的對象的序列化和反序列化分開在不同的進(jìn)程中,以得到正確結(jié)果。見源文件:WriteStudent.javaReadStudent.java

第8頁,課件共16頁,創(chuàng)作于2023年2月transient成員變量transient變量不能被序列化,那么可以修飾以下類型的變量。(1)實例變量不代表對象的固有的內(nèi)部數(shù)據(jù),僅僅代表具有一定邏輯含義的臨時數(shù)據(jù)?!?.privateStringfirstName;privateStringlastName;

privatetransientStringfullName;(2)實例變量表示一些比較敏感的信息(密碼等),出于安全方面的原因不希望被序列化。(3)實例變量需要按照用戶自定義的方式序列化,如經(jīng)過加密后再序列化。第9頁,課件共16頁,創(chuàng)作于2023年2月具有關(guān)聯(lián)關(guān)系的對象之間的序列化ClassTeacherimplementsSerializable{…………

privateSet<Student>stu=newHashSet<Student>();}當(dāng)序列化Teacher對象時,系統(tǒng)還會序列化Teacher所關(guān)聯(lián)的其他可序列化的對象(Student對象)。

ABCEDGHF第10頁,課件共16頁,創(chuàng)作于2023年2月自定義序列化方式-Serializable接口自定義序列化方式,在可序列化類中定義下面兩個方法:privatevoidwriteObject(ObjectOutputStreamout)throwsIOExceptionprivatevoidreadObject(ObjectInputStreamin)throwsIOException,ClassNotFoundException

注意:上述兩個方法不是java.io.Serializable接口中定義的方法第11頁,課件共16頁,創(chuàng)作于2023年2月自定義序列化方式-Serializable接口自定義序列化方式常用于以下情況:確保序列化的安全性,對敏感信息加密后再序列化,在反序列化時先解密。見源文件:ObjSerSecurity.java(2)確保對象的成員變量符合正確的約束條件。見源文件:ObjSerConstraint.java(3)能夠優(yōu)化序列化的性能見源文件:ObjSerCapacity.javaObjSerOptimizeCapacity.java注意:需要按自定義方式序列化的成員變量,是否定義為transient類型無關(guān)緊要。第12頁,課件共16頁,創(chuàng)作于2023年2月自定義序列化方式-Externalizable接口Externalizable接口繼承自Serializable接口。如果一個類實現(xiàn)了Externalizable接口,那么將完全由這個類控制自身的序列化行為。

publicvoidwriteExternal(ObjectOutputout)throwsIOExceptionpublicvoidreadExternal(ObjectInputin)throwsIOException,ClassNotFoundException

注意:對實現(xiàn)了Externalizable接口的類的對象進(jìn)行反序列化操作時,會調(diào)用該類無參的構(gòu)造方法見源文件:ObjExternalSer.java第13頁,課件共16頁,創(chuàng)作于2023年2月默認(rèn)序列化與自定義序列化的比較默認(rèn)序列化方式的不足對象當(dāng)中的不易對外公開的敏感數(shù)據(jù)進(jìn)行序列化,安全性低。(2)不會檢查對象的成員變量是否合乎正確的約束條件。(3)默認(rèn)的序列化方式需要對對象圖進(jìn)行遞歸遍歷,如果對象圖很復(fù)雜,會消耗很多空間和時間,甚至引起Java虛擬機堆棧溢出。自定義序列化方式兩種:實現(xiàn)Serializable接口,并且提供private的writeObject()和readObject()。(2)實現(xiàn)Externalizable接口,實現(xiàn)writeExternal()和readExternal()方法,必須提供public無參的構(gòu)造方法。第14頁,課件共16頁,創(chuàng)作于2023年2月可序列化類的不同版本的序列化兼容性實現(xiàn)Serializable接口的類都有一個表示序列化版本標(biāo)識符的靜態(tài)常量。

privatestaticfinallongserialVersionUID;JDK安裝目錄的bin目錄下有個serialver.exe用于查看serialVersionUID。

用法:serialver字節(jié)碼serialVersionUID依賴于內(nèi)部的實現(xiàn)細(xì)節(jié)與編譯器。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論