對(duì)象的序列化與反序列化_第1頁(yè)
對(duì)象的序列化與反序列化_第2頁(yè)
對(duì)象的序列化與反序列化_第3頁(yè)
對(duì)象的序列化與反序列化_第4頁(yè)
對(duì)象的序列化與反序列化_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

關(guān)于對(duì)象的序列化與反序列化第1頁(yè),共17頁(yè),2023年,2月20日,星期三本章內(nèi)容對(duì)象序列化與反序列化的基本概念實(shí)現(xiàn)序列化的基本過(guò)程

Serializable和Externalizable接口

ObjectOutputStream和ObjectInputStream自定義序列化的兩種方式默認(rèn)序列化方式與自定義序列化方式的比較類不同版本的序列化兼容性第2頁(yè),共17頁(yè),2023年,2月20日,星期三對(duì)象序列化對(duì)象序列化:將Java對(duì)象轉(zhuǎn)化成二進(jìn)制字節(jié)流的過(guò)程。對(duì)象反序列化:

將二進(jìn)制字節(jié)流恢復(fù)為Java對(duì)象的過(guò)程。對(duì)象序列化的主要用途:將對(duì)象的字節(jié)序列永久的保存到硬盤(pán)上,通常存放在一個(gè)文件中。(2)在網(wǎng)絡(luò)中跨虛擬機(jī)傳遞對(duì)象。第3頁(yè),共17頁(yè),2023年,2月20日,星期三Serializable和Externalizable接口序列化的過(guò)程:只有實(shí)現(xiàn)了Serializable和Externalizable接口的類的對(duì)象才能進(jìn)行序列化操作。

Externalizable接口繼承自Serializable口,實(shí)現(xiàn)Externalizable接口的類需要自行控制序列化的行為。實(shí)現(xiàn)Serializable接口的類采用默認(rèn)的序列化方式。

JDK類庫(kù)中的部分類(String,封裝類和Date類等)都實(shí)現(xiàn)了Serializable接口。第4頁(yè),共17頁(yè),2023年,2月20日,星期三ObjectInputStream和ObjectOutputStream(2)對(duì)象輸入和輸出流構(gòu)造方法:ObjectInputStream(InputStreamin)ObjectOutputStream(OutputStreamout)

見(jiàn)源文件:ObjectSerTest.java第5頁(yè),共17頁(yè),2023年,2月20日,星期三ObjectInputStreamObjectInputStream按照默認(rèn)方式進(jìn)行反序列化時(shí),具有以下特點(diǎn):(1)如果內(nèi)存中對(duì)象所屬的類還沒(méi)有加載,那么會(huì)加載并初始化這個(gè)類。如果在classpath中找不到相應(yīng)的類文件,拋出ClassNotFoundException。(2)在反序列化時(shí)不會(huì)調(diào)用類的任何構(gòu)造方法。第6頁(yè),共17頁(yè),2023年,2月20日,星期三對(duì)象序列化注意的問(wèn)題:

(1)序列化和反序列化的順序要一致

(2)保存對(duì)象的文件名一般不要用.txt文件,換成.obj或.ser文件最好第7頁(yè),共17頁(yè),2023年,2月20日,星期三對(duì)象序列化ObjectOutputStream只能對(duì)實(shí)現(xiàn)了Serializable接口的類的對(duì)象進(jìn)行默認(rèn)的序列化操作,這種操作僅僅為對(duì)象的非transient和非static的實(shí)例屬性進(jìn)行序列化。

見(jiàn)源文件:非transient/ObjectSerTest1.java

注意:靜態(tài)屬性屬于類,不屬于對(duì)象。靜態(tài)屬性在類加載的時(shí)候初始化,將含有靜態(tài)屬性的對(duì)象的序列化和反序列化分開(kāi)在不同的進(jìn)程中,以得到正確結(jié)果。

見(jiàn)源文件:非transient/WriteStudent.java

非transient/ReadStudent.java

第8頁(yè),共17頁(yè),2023年,2月20日,星期三transient成員屬性transient屬性不能被序列化,那么可以修飾以下類型的屬性。(1)實(shí)例屬性不代表對(duì)象的固有的內(nèi)部數(shù)據(jù),僅僅代表具有一定邏輯含義的臨時(shí)數(shù)據(jù)。

………..privateStringfirstName;privateStringlastName;

privatetransientStringfullName;(2)實(shí)例屬性表示一些比較敏感的信息(密碼等),出于安全方面的原因不希望被序列化。(3)實(shí)例屬性需要按照用戶自定義的方式序列化,如經(jīng)過(guò)加密后再序列化。第9頁(yè),共17頁(yè),2023年,2月20日,星期三具有關(guān)聯(lián)關(guān)系的對(duì)象之間的序列化ClassTeacherimplementsSerializable{…………

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

ABCEDF第10頁(yè),共17頁(yè),2023年,2月20日,星期三自定義序列化方式-Serializable接口自定義序列化方式,在可序列化類中定義下面兩個(gè)方法:privatevoidwriteObject(ObjectOutputStreamout)throwsIOExceptionprivatevoidreadObject(ObjectInputStreamin)throwsIOException,ClassNotFoundException

注意:上述兩個(gè)方法不是java.io.Serializable接口中定義的方法第11頁(yè),共17頁(yè),2023年,2月20日,星期三自定義序列化方式-Serializable接口自定義序列化方式常用于以下情況:確保序列化的安全性,對(duì)敏感信息加密后再序列化,在反序列化時(shí)先解密。見(jiàn)源文件:ObjSerSecurity.java(2)確保對(duì)象的成員屬性符合正確的約束條件。見(jiàn)源文件:ObjSerConstraint.java(3)能夠優(yōu)化序列化的性能見(jiàn)源文件:性能優(yōu)化/ObjSerCapacity.java性能優(yōu)化/ObjSerOptimizeCapacity.java注意:需要按自定義方式序列化的成員屬性,是否定義為transient類型無(wú)關(guān)緊要。第12頁(yè),共17頁(yè),2023年,2月20日,星期三自定義序列化方式-Externalizable接口Externalizable接口繼承自Serializable接口。如果一個(gè)類實(shí)現(xiàn)了Externalizable接口,那么將完全由這個(gè)類控制自身的序列化行為。publicvoidwriteExternal(ObjectOutputout)throwsIOExceptionpublicvoidreadExternal(ObjectInputin)throwsIOException,ClassNotFoundException

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

實(shí)現(xiàn)Serializable接口的類都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)常量。

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

用法:serialver字節(jié)碼serialVersionUID依賴于內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)與編譯器。第15頁(yè),共17頁(yè),2023年,2月20日,星期三可序列化類

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論