java对象为什么要实现序列化
序列化是一種用來處理對象流的機(jī)制
所謂對象流:
????????就是將對象的內(nèi)容進(jìn)行流化,可以對流化后的對象進(jìn)行讀寫操作,也可以將流化后的對象傳輸于網(wǎng)絡(luò)之間。
序列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題
序列化的實現(xiàn):
????????將需要被序列化的類實現(xiàn)serializable接口(標(biāo)機(jī)接口),該接口沒有需要實現(xiàn)的方法,implements serializable只是為了標(biāo)注該對象是可被序列化的,然后使用一個輸出流(如:fileOutputStream)來構(gòu)造一個objectOutoutStream(對象流)對象;接著使用objectOutputStream對象的writeObject(object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸出流。
什么時候使用序列化:
? ? ? ? 1、對象序列化可以實現(xiàn)分布式對象
? ? ? ? ? ? ? ? 主要應(yīng)用例如RMI(即遠(yuǎn)程調(diào)用Remote Method Invocation)要利用對象序列化運行遠(yuǎn)程主機(jī)上的服務(wù),就像在本地機(jī)上運行對象時一樣
? ? ? ? 2、java對象序列化不僅保留一個對象的數(shù)據(jù),而且遞歸保存對象引用的每個對象的數(shù)據(jù)
? ? ? ? ? ? ? ? 可以將整個對象層次寫入字節(jié)流中,可以保存在文件中或在網(wǎng)絡(luò)連接上傳遞,利用對象序列化可以進(jìn)行對象的“深復(fù)制”,即復(fù)制對象本身及引用的對象本身,序列化一個對象可能得到整個對象序列
? ? ? ? 3、序列化可以將內(nèi)存中的類寫入文件或數(shù)據(jù)庫中
? ? ? ? ? ? ? ? 比如:將某個類序列化后存為問價,下次讀取時只需將文件中的數(shù)據(jù)反序列化就可以將原先的類還原到內(nèi)存中,也可以將類序列化為流數(shù)據(jù)進(jìn)行傳輸,總的來說就是將一個已經(jīng)實例化的類轉(zhuǎn)成文件存儲,下次需要實例化的時候只要反序列化即可將類實例化到內(nèi)存中,并保留序列化時類中的所有變量和狀態(tài)
? ? ? ? 4、對象、文件、數(shù)據(jù)有許多不同的格式,很難統(tǒng)一傳輸和保存
? ? ? ? ? ? ? ? 序列化以后就都是字節(jié)流了,無論是什么東西,都能變成一樣的東西,就可以進(jìn)行通用的格式傳輸或保存,傳輸結(jié)束以后,要再次使用,就進(jìn)行反序列化還原,這樣對象還是對象,文件還是文件
因為java中要將對象序列化為流的形式進(jìn)行傳輸
對象的序列化就是為了數(shù)據(jù)傳輸,在你的代碼的里是對象格式,而在傳輸?shù)臅r候不可能還保持這對象的樣子。
當(dāng)兩個進(jìn)程再進(jìn)行遠(yuǎn)程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù),無論是何種類型的數(shù)據(jù)都會以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳輸,發(fā)送方需要將這個java對象轉(zhuǎn)換為字節(jié)序列才能在網(wǎng)絡(luò)上傳送,接收方則需要把字節(jié)序列再恢復(fù)為java對象
1、概念
? ? ? ? 序列化:把java對象轉(zhuǎn)換為字節(jié)序列的過程
? ? ? ? 反序列化:把字節(jié)序列恢復(fù)為java對象的過程
2、用途:
? ? ? ? a、把對象的字節(jié)序列永久的保存到硬盤上,通常放在一個文件中
? ? ? ? b、在網(wǎng)絡(luò)上傳輸對象的字節(jié)序列
- 所謂的serializable,就是java提供的通用數(shù)據(jù)保存和讀取的接口,至于從什么地方讀出來和保存到那里去都被隱藏在函數(shù)參數(shù)的背后了,這樣子,任何類型只要實現(xiàn)了serializable接口,就可以被保存到文件中,或者作為數(shù)據(jù)流通過網(wǎng)絡(luò)發(fā)送到別的地方,也可以用管道來傳輸系統(tǒng)的其他程序中,這樣子極大地簡化了類的設(shè)計,只要設(shè)計一個保存一個讀取功能就能解決上面說的所有問題
- java的對象序列化能讓你將一個實現(xiàn)了serializable接口的對象轉(zhuǎn)換成一組byte,這樣日后要用這個對象的時候,你就能把這些byte數(shù)據(jù)恢復(fù)出來,并據(jù)此從新構(gòu)建那個對象了
- 工作流當(dāng)中流程變量的幾種數(shù)據(jù)類型:string、integer、short、long、double、boolean、date、binary、serializable,這就是為什么要將javabean實現(xiàn)序列化的原因,因為你將對象設(shè)置到流程變量中必須要實現(xiàn)序列化,否則會在設(shè)置流程變量的時候報錯找不到該類型
- java對象序列化機(jī)制就是把內(nèi)存中的java對象轉(zhuǎn)成二進(jìn)制流,java對象序列化后很方便的存儲或者在網(wǎng)絡(luò)中傳輸
- java的序列化機(jī)制是通過運行時判斷類的序列化ID(serialVersionUID)來判斷版本的一致性
- 在反序列時,java虛擬機(jī)會通過二進(jìn)制流中的serialVarsionUID與本地的相對應(yīng)的實體類進(jìn)行比較,如果相同就認(rèn)為是一致的,可以反序列化,正確獲得信息,否則拋出序列化版本不一致的異常
所以涉及到數(shù)據(jù)傳輸或者存儲的類,嚴(yán)格意義上來說都要加上序列化ID,這也是一種良好的編程習(xí)慣
總結(jié)
以上是生活随笔為你收集整理的java对象为什么要实现序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投票系统投票界面
- 下一篇: [Maven实战-许晓斌]-[第二章]-