更新時(shí)間:2019-08-31 09:00:00 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2077次
今天動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)為大家介紹“為什么JAVA對(duì)象需要實(shí)現(xiàn)序列化?”,希望通過此文大家能夠知道JAVA對(duì)象需要實(shí)現(xiàn)序列化的原因,下面大家就隨小編一起看看JAVA對(duì)象需要實(shí)現(xiàn)序列化的原因吧?
序列化是一種用來(lái)處理對(duì)象流的機(jī)制。
所謂對(duì)象流:就是將對(duì)象的內(nèi)容進(jìn)行流化。可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。
序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問題。
序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口(標(biāo)記接口),該接口沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象;接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。
什么時(shí)候使用序列化呢?
1、對(duì)象序列化可以實(shí)現(xiàn)分布式對(duì)象。
主要應(yīng)用例如:RMI(即遠(yuǎn)程調(diào)用Remote Method Invocation)要利用對(duì)象序列化運(yùn)行遠(yuǎn)程主機(jī)上的服務(wù),就像在本地機(jī)上運(yùn)行對(duì)象時(shí)一樣。
2、java對(duì)象序列化不僅保留一個(gè)對(duì)象的數(shù)據(jù),而且遞歸保存對(duì)象引用的每個(gè)對(duì)象的數(shù)據(jù)。
可以將整個(gè)對(duì)象層次寫入字節(jié)流中,可以保存在文件中或在網(wǎng)絡(luò)連接上傳遞。利用對(duì)象序列化可以進(jìn)行對(duì)象的"深復(fù)制",即復(fù)制對(duì)象本身及引用的對(duì)象本身。序列化一個(gè)對(duì)象可能得到整個(gè)對(duì)象序列。
3、序列化可以將內(nèi)存中的類寫入文件或數(shù)據(jù)庫(kù)中。
比如:將某個(gè)類序列化后存為文件,下次讀取時(shí)只需將文件中的數(shù)據(jù)反序列化就可以將原先的類還原到內(nèi)存中。也可以將類序列化為流數(shù)據(jù)進(jìn)行傳輸。總的來(lái)說(shuō)就是將一個(gè)已經(jīng)實(shí)例化的類轉(zhuǎn)成文件存儲(chǔ),下次需要實(shí)例化的時(shí)候只要反序列化即可將類實(shí)例化到內(nèi)存中并保留序列化時(shí)類中的所有變量和狀態(tài)。
4、 對(duì)象、文件、數(shù)據(jù),有許多不同的格式,很難統(tǒng)一傳輸和保存。
序列化以后就都是字節(jié)流了,無(wú)論原來(lái)是什么東西,都能變成一樣的東西,就可以進(jìn)行通用的格式傳輸或保存,傳輸結(jié)束以后,要再次使用,就進(jìn)行反序列化還原,這樣對(duì)象還是對(duì)象,文件還是文件
因?yàn)镴AVA中要將對(duì)象序列化為 流的形式 進(jìn)行傳輸。
對(duì)象的序列化就是為了數(shù)據(jù)傳輸,在你的代碼的里是對(duì)象格式,而在傳輸?shù)臅r(shí)候不可能還保持這對(duì)象的樣子。
當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象。
概念
序列化:把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程。
反序列化:把字節(jié)序列恢復(fù)為Java對(duì)象的過程。
用途 對(duì)象的序列化主要有兩種用途:
1、把對(duì)象的字節(jié)序列永久地保存到硬盤上,通常存放在一個(gè)文件中。
2、在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。
所謂的Serializable,就是java提供的通用數(shù)據(jù)保存和讀取的接口。至于從什么地方讀出來(lái)和保存到哪里去都被隱藏在函數(shù)參數(shù)的背后了。這樣子,任何類型只要實(shí)現(xiàn)了Serializable接口,就可以被保存到文件中,或者作為數(shù)據(jù)流通過網(wǎng)絡(luò)發(fā)送到別的地方。也可以用管道來(lái)傳輸?shù)较到y(tǒng)的其他程序中。這樣子極大的簡(jiǎn)化了類的設(shè)計(jì)。只要設(shè)計(jì)一個(gè)保存一個(gè)讀取功能就能解決上面說(shuō)得所有問題。
java的"對(duì)象序列化"能讓你將一個(gè)實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換成一組byte,這樣日后要用這個(gè)對(duì)象時(shí)候,你就能把這些byte數(shù)據(jù)恢復(fù)出來(lái),并據(jù)此重新構(gòu)建那個(gè)對(duì)象了。
工作流當(dāng)中流程變量的幾種數(shù)據(jù)類型:string、integer、short、long、double、boolean、date、binary、serializable,這就是為什么要將javabean實(shí)現(xiàn)序列化的原因,因?yàn)槟銓?duì)象設(shè)置到流程變量中必須要實(shí)現(xiàn)序列化,否則會(huì)在設(shè)置流程變量的時(shí)候報(bào)錯(cuò)找不到該類型。
java對(duì)象序列化機(jī)制就是把內(nèi)存中的Java對(duì)象(User之類的JavaBean)轉(zhuǎn)換成二進(jìn)制流。java對(duì)象序列化后可以很方便的存儲(chǔ)或者在網(wǎng)絡(luò)中傳輸。
Java的序列化機(jī)制是通過運(yùn)行時(shí)判斷類的序列化ID(serialVersionUID)來(lái)判定版本的一致性。
在反序列化時(shí),java虛擬機(jī)會(huì)通過二進(jìn)制流中的serialVersionUID與本地的對(duì)應(yīng)的實(shí)體類進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,正確獲得信息,否則拋出序列化版本不一致的異常。
所以涉及到數(shù)據(jù)傳輸或者存儲(chǔ)的類,嚴(yán)格意義上來(lái)說(shuō)都要加上序列化ID,這也是一種良好的編程習(xí)慣。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)介紹的“為什么JAVA對(duì)象需要實(shí)現(xiàn)序列化?”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743