為什么要實(shí)現(xiàn)serializable接口作用
為什么要實(shí)現(xiàn)serializable接口作用
最重要的兩個(gè)原因是:1、將對(duì)象的狀態(tài)保存在存儲(chǔ)媒體中以便可以在以后重新創(chuàng)建出完全相同的副本;2、按值將對(duì)象從一個(gè)應(yīng)用程序域發(fā)送至另一個(gè)應(yīng)用程序域。實(shí)現(xiàn)serializable接口的作用是就是可以把對(duì)象存到字節(jié)流,然后可以恢復(fù)。
所以你想如果你的對(duì)象沒(méi)實(shí)現(xiàn)序列化怎么才能進(jìn)行**傳輸呢,要**傳輸就得轉(zhuǎn)為字節(jié)流,所以在分布式應(yīng)用中,你就得實(shí)現(xiàn)序列化,如果你不需要分布式應(yīng)用,那就沒(méi)那個(gè)必要實(shí)現(xiàn)序列化。
某些java類為什么要實(shí)現(xiàn)Serializable接口
Serializable接口是啟用其序列化功能的接口。實(shí)現(xiàn)java.io.Serializable接口的類是可序列化的。
沒(méi)有實(shí)現(xiàn)此接口的類將不能使它們的任一狀態(tài)被序列化或逆序列化。
使用情況:當(dāng)遍歷一個(gè)圖形時(shí),可能會(huì)遇到不支持可序列化接口的對(duì)象。在此情況下,將拋出NotSerializableException,并將標(biāo)識(shí)不可序列化對(duì)象的類。在序列化和反序列化過(guò)程中需要特殊處理的類必須使用下列準(zhǔn)確簽名來(lái)實(shí)現(xiàn)特殊方法:privatevoidwriteObject(java.io.ObjectOutputStreamout)throwsIOExceptionprivatevoidreadObject(java.io.ObjectInputStreamin)throwsIOException,ClassNotFoundException;writeObject方法負(fù)責(zé)寫入特定類的對(duì)象的狀態(tài),以便相應(yīng)的readObject方法可以還原它。通過(guò)調(diào)用out.defaultWriteObject可以調(diào)用保存Object的字段的默認(rèn)機(jī)制。
該方法本身不需要涉及屬于其超類或子類的狀態(tài)。狀態(tài)是通過(guò)使用writeObject方法或使用DataOutput支持的用于基本數(shù)據(jù)類型的方法將各個(gè)字段寫入ObjectOutputStream來(lái)保存的。readObject方法負(fù)責(zé)從流中讀取并還原類字段。
它可以調(diào)用in.defaultReadObject來(lái)調(diào)用默認(rèn)機(jī)制,以還原對(duì)象的非靜態(tài)和非瞬態(tài)字段。defaultReadObject方法使用流中的信息來(lái)分配流中通過(guò)當(dāng)前對(duì)象中相應(yīng)命名字段保存的對(duì)象的字段。這用于處理類發(fā)展后需要添加新字段的情形。
將對(duì)象寫入流時(shí)需要指定要使用的替代對(duì)象的可序列化類,應(yīng)使用準(zhǔn)確的簽名來(lái)實(shí)現(xiàn)此特殊方法:ANY-ACCESS-MODIFIERObjectwriteReplace()throwsObjectStreamException;此writeReplace方法將由序列化調(diào)用,前提是如果此方法存在,而且它可以通過(guò)被序列化對(duì)象的類中定義的一個(gè)方法訪問(wèn)。因此,該方法可以擁有私有(private)、受保護(hù)的(protected)和包私有(package-private)訪問(wèn)。子類對(duì)此方法的訪問(wèn)遵循java訪問(wèn)規(guī)則。
在從流中讀取類的一個(gè)實(shí)例時(shí)需要指定替代的類應(yīng)使用的準(zhǔn)確簽名來(lái)實(shí)現(xiàn)此特殊方法。ANY-ACCESS-MODIFIERObjectreadResolve()throwsObjectStreamException;此readResolve方法遵循與writeReplace相同的調(diào)用規(guī)則和訪問(wèn)規(guī)則。序列化運(yùn)行時(shí)使用一個(gè)稱為serialVersionUID的版本號(hào)與每個(gè)可序列化類相關(guān)聯(lián),該序列號(hào)在反序列化過(guò)程中用于驗(yàn)證序列化對(duì)象的發(fā)送者和接收者是否為該對(duì)象加載了與序列化兼容的類。如果接收者加載的該對(duì)象的類的serialVersionUID與對(duì)應(yīng)的發(fā)送者的類的版本號(hào)不同,則反序列化將會(huì)導(dǎo)致InvalidClassException。
可序列化類可以通過(guò)聲明名為\”serialVersionUID\”的字段(該字段必須是靜態(tài)(static)、最終(final)的long型字段)顯式聲明其自己的serialVersionUID:ANY-ACCESS-MODIFIERstaticfinallongserialVersionUID=42L;如果可序列化類未顯式聲明serialVersionUID,則序列化運(yùn)行時(shí)將基于該類的各個(gè)方面計(jì)算該類的默認(rèn)serialVersionUID值,如“Java(TM)對(duì)象序列化規(guī)范”中所述。不過(guò),強(qiáng)烈建議所有可序列化類都顯式聲明serialVersionUID值,原因計(jì)算默認(rèn)的serialVersionUID對(duì)類的詳細(xì)信息具有較高的敏感性,根據(jù)編譯器實(shí)現(xiàn)的不同可能千差萬(wàn)別,這樣在反序列化過(guò)程中可能會(huì)導(dǎo)致意外的InvalidClassException。因此,為保證serialVersionUID值跨不同java編譯器實(shí)現(xiàn)的一致性,序列化類必須聲明一個(gè)明確的serialVersionUID值。還強(qiáng)烈建議使用private修改器顯示聲明serialVersionUID(如果可能),原因是這種聲明僅應(yīng)用于立即聲明類–serialVersionUID字段作為繼承成員沒(méi)有用處。
————————–實(shí)現(xiàn)java.io.Serializable接口的類是可序列化的。沒(méi)有實(shí)現(xiàn)此接口的類將不能使它們的任一狀態(tài)被序列化或逆序列化。序列化類的所有子類本身都是可序列化的。這個(gè)序列化接口沒(méi)有任何方法和域,僅用于標(biāo)識(shí)序列化的語(yǔ)意。
允許非序列化類的子類型序列化,子類型可以假定負(fù)責(zé)保存和恢復(fù)父類型的公有的、保護(hù)的和(如果可訪問(wèn))包的域的狀態(tài)。只要該類(即父類)有一個(gè)無(wú)參構(gòu)造子,可初始化它的狀態(tài),那么子類型就可承擔(dān)上述職責(zé);如果該類沒(méi)有無(wú)參構(gòu)造函數(shù),在這種情況下申明一個(gè)可序列化的類是一個(gè)錯(cuò)誤。此錯(cuò)誤將在運(yùn)行時(shí)被檢測(cè)。
例如:Integer實(shí)現(xiàn)了Serializable,所以可以把一個(gè)Integer的對(duì)象用IO寫到文件里,之后再可以從文件里讀出,如你開始寫入的時(shí)候那個(gè)對(duì)象的intValue()是5的話,那讀出來(lái)之后也是5。這一點(diǎn)體現(xiàn)了用序化類的作用,即用來(lái)傳送類的對(duì)象。當(dāng)一個(gè)JavaBean在構(gòu)造工具內(nèi)被用戶化,并與其它Bean建立連接之后,它的所有狀態(tài)都應(yīng)當(dāng)可被保存,下一次被load進(jìn)構(gòu)造工具內(nèi)或在運(yùn)行時(shí),就應(yīng)當(dāng)是上一次修改完的信息。
為了能做到這一點(diǎn),要把Bean的某些字段的信息保存下來(lái),在定義Bean時(shí)要使它實(shí)現(xiàn)Java.io.Serializable接口。例如:publicclassButtonimplementsJava.io.Serializable{……}實(shí)現(xiàn)了序列化接口的Bean中字段的信息將被自動(dòng)保存。若不想保存某些字(這里的Bean中字段的信息將被自動(dòng)保存是什么意思?這個(gè)自動(dòng)保存是怎么實(shí)現(xiàn)的?)段的信息則可在這些字段前冠以transient或static關(guān)鍵字,transient和static變量的信息是不可被保存的。通常,一個(gè)Bean所有公開出來(lái)的屬性都應(yīng)當(dāng)是被保存的,也可有選擇地保存內(nèi)部狀態(tài)。
Bean開發(fā)者在修改軟件時(shí),可以添加字段,移走對(duì)其它類的引用,改變一個(gè)字段的private、protected或public狀態(tài),這些都不影響類的存儲(chǔ)結(jié)構(gòu)關(guān)系。然而,當(dāng)從類中刪除一個(gè)字段,改變一個(gè)變量在類體系中的位置,把某個(gè)字段改成transient/static,或原來(lái)是transient/static,現(xiàn)改為別的特性時(shí),都將引起存儲(chǔ)關(guān)系的變化。所謂的Serializable,就是java提供的通用數(shù)據(jù)保存和讀取的接口。
至于從什么地方讀出來(lái)和保存到哪里去都被隱藏在函數(shù)參數(shù)的背后了。這樣子,任何類型只要實(shí)現(xiàn)了Serializable接口,就可以被保存到文件中,或者作為數(shù)據(jù)流通過(guò)**發(fā)送到別的地方。也可以用管道來(lái)傳輸?shù)较到y(tǒng)的其他程序中。這樣子極大的簡(jiǎn)化了類的設(shè)計(jì)。
只要設(shè)計(jì)一個(gè)保存一個(gè)讀取功能就能解決上面說(shuō)得所有問(wèn)題。
java序列化為什么要實(shí)現(xiàn)serializable
不一定要 根據(jù)需求 序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化。可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于**之間。
序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問(wèn)題。
序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口,該接口沒(méi)有需要實(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ù)的話則用輸入流。 序列化:序列化是將對(duì)象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^(guò)程。例如,可以序列化一個(gè)對(duì)象,然后使用 HTTP 通過(guò) Internet 在客戶端和服務(wù)器之間傳輸該對(duì)象。在另一端,反序列化將從該流重新構(gòu)造對(duì)象。
百科是對(duì)象**化的一種機(jī)制。 確切的說(shuō)應(yīng)該是對(duì)象的序列化,一般程序在運(yùn)行時(shí),產(chǎn)生對(duì)象,這些對(duì)象隨著程序的停止運(yùn)行而消失,但如果我們想把某些對(duì)象(因?yàn)槭菍?duì)象,所以有各自不同的特性)保存下來(lái),在程序終止運(yùn)行后,這些對(duì)象仍然存在,可以在程序再次運(yùn)行時(shí)讀取這些對(duì)象的值,或者在其他程序中利用這些保存下來(lái)的對(duì)象。這種情況下就要用到對(duì)象的序列化。
只有序列化的對(duì)象才可以存儲(chǔ)在存儲(chǔ)設(shè)備上。為了對(duì)象的序列化而需要繼承的接口也只是一個(gè)象征性的接口而已,也就是說(shuō)繼承這個(gè)接口說(shuō)明這個(gè)對(duì)象可以被序列化了,沒(méi)有其他的目的。之所以需要對(duì)象序列化,是因?yàn)橛袝r(shí)候?qū)ο笮枰?*上傳輸,傳輸?shù)臅r(shí)候需要這種序列化處理,從服務(wù)器硬盤上把序列化的對(duì)象取出,然后通過(guò)**傳到客戶端,再由客戶端把序列化的對(duì)象讀入內(nèi)存,執(zhí)行相應(yīng)的處理。
對(duì)象序列化是java的一個(gè)特征,通過(guò)該特征可以將對(duì)象寫作一組字節(jié)碼,當(dāng)在其他位置讀到這些字節(jié)碼時(shí),可以依此創(chuàng)建一個(gè)新的對(duì)象,而且新對(duì)象的狀態(tài)與原對(duì)象完全相同。為了實(shí)現(xiàn)對(duì)象序列化,要求必須能夠訪問(wèn)類的私有變量,從而保證對(duì)象狀態(tài)能夠正確的得以保存和恢復(fù)。相應(yīng)的,對(duì)象序列化API能夠在對(duì)象重建時(shí),將這些值還原給私有的數(shù)據(jù)成員。
這是對(duì)java語(yǔ)言訪問(wèn)權(quán)限的挑戰(zhàn)。通常用在服務(wù)器客戶端的對(duì)象交換上面,另外就是在本機(jī)的存儲(chǔ)。 對(duì)象序列化的最主要的用處就是在傳遞,和保存對(duì)象(object)的時(shí)候,保證對(duì)象的完整性和可傳遞性。
javabean為什么一定要實(shí)現(xiàn)serializable接口
ser