国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
序列化
無意當(dāng)中想到這個(gè)問題,然后google 一下。找到一篇對(duì) serialization 介紹的文章,關(guān)于這個(gè)問題比較多的人解釋是:hibernate有二級(jí)緩存,緩存會(huì)將對(duì)象寫進(jìn)硬盤,就必須序列化,以及兼容對(duì)象在網(wǎng)絡(luò)中的傳輸 等等...

    
目的:將二級(jí)緩存中的內(nèi)容持久化保存下來,便于恢復(fù)緩存的信息,hibernate的緩存機(jī)制通過使用序列化,斷定應(yīng)該是基于序列化的緩存,如沒有serializable接口,在序列化時(shí),使用objectOutputStreamwriteobject)方法將對(duì)象保存到文件時(shí)將會(huì)出現(xiàn)異常。 
      java
中常見的幾個(gè)類(如:Interger、String等),都實(shí)現(xiàn)了serializable接口 
   接口 java.io.Serializable 
      
      public interface Serializable 
   實(shí)現(xiàn) java.io.Serializable 接口的類是可序列化的。沒有實(shí)現(xiàn)此接口的類將不能使它們的任一狀態(tài)被序列化或逆序列化。序列化類的所有子類本身都是可序列化的。這個(gè)序列化接口沒有任何方法和域,僅用于標(biāo)識(shí)序列化的語意。 
   控制序列化的時(shí)候還可能會(huì)碰到,要禁止Java的序列化機(jī)制自動(dòng)存取某個(gè)子對(duì)象的情況。這種需求是很常見的,你肯定不會(huì)希望把口令之類敏感信息也序列化了。因?yàn)橐坏┬蛄谢?,別人就能通過分析文件和截獲網(wǎng)絡(luò)傳輸來進(jìn)行破解,這樣即便訪問權(quán)限是private的也保不住了。
   序列化就是一種用來處理對(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接口,該接口沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。 
   
   序列化
: 序列化是將對(duì)象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^程。例如,可以序列化一個(gè)對(duì)象,然后使用 HTTP 通過 Internet 在客戶端和服務(wù)器之間傳輸該對(duì)象。在另一端,反序列化將從該流重新構(gòu)造對(duì)象。
是對(duì)象永久化的一種機(jī)制。 
   確切的說應(yīng)該是對(duì)象的序列化,一般程序在運(yùn)行時(shí),產(chǎn)生對(duì)象,這些對(duì)象隨著程序的停止運(yùn)行而消失,但如果我們想把某些對(duì)象(因?yàn)槭菍?duì)象,所以有各自不同的特性)保存下來,在程序終止運(yùn)行后,這些對(duì)象仍然存在,可以在程序再次運(yùn)行時(shí)讀取這些對(duì)象的值,或者在其他程序中利用這些保存下來的對(duì)象。這種情況下就要用到對(duì)象的序列化。 
   只有序列化的對(duì)象才可以存儲(chǔ)在存儲(chǔ)設(shè)備上。為了對(duì)象的序列化而需要繼承的接口也只是一個(gè)象征性的接口而已,也就是說繼承這個(gè)接口說明這個(gè)對(duì)象可以被序列化了,沒有其他的目的。之所以需要對(duì)象序列化,是因?yàn)橛袝r(shí)候?qū)ο笮枰诰W(wǎng)絡(luò)上傳輸,傳輸?shù)臅r(shí)候需要這種序列化處理,從服務(wù)器硬盤上把序列化的對(duì)象取出,然后通過網(wǎng)絡(luò)傳到客戶端,再由客戶端把序列化的對(duì)象讀入內(nèi)存,執(zhí)行相應(yīng)的處理。 

   對(duì)象序列化是java的一個(gè)特征,通過該特征可以將對(duì)象寫作一組字節(jié)碼,當(dāng)在其他位置讀到這些字節(jié)碼時(shí),可以依此創(chuàng)建一個(gè)新的對(duì)象,而且新對(duì)象的狀態(tài)與原對(duì)象完全相同。為了實(shí)現(xiàn)對(duì)象序列化,要求必須能夠訪問類的私有變量,從而保證對(duì)象狀態(tài)能夠正確的得以保存和恢復(fù)。相應(yīng)的,對(duì)象序列化API能夠在對(duì)象重建時(shí),將這些值還原給私有的數(shù)據(jù)成員。這是對(duì)java語言訪問權(quán)限的挑戰(zhàn)。通常用在服務(wù)器客戶端的對(duì)象交換上面,另外就是在本機(jī)的存儲(chǔ)。 
   對(duì)象序列化的最主要的用處就是在傳遞,和保存對(duì)象(object)的時(shí)候,保證對(duì)象的完整性和可傳遞性。譬如通過網(wǎng)絡(luò)傳輸,或者把一個(gè)對(duì)象保存成一個(gè)文件的時(shí)候,要實(shí)現(xiàn)序列化接口 。 
   即使你沒有用過對(duì)象序列化(serialization),你可能也知道它。但你是否知道 Java 還支持另外一種形式的對(duì)象持久化,外部化(externalization)?

下面是序列化和外部化在代碼級(jí)的關(guān)聯(lián)方式:

public interface Serializable {}

public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}

比較java.io.Externalizablejava.io.Serializable 序列化和外部化的主要區(qū)別

外部化和序列化是實(shí)現(xiàn)同一目標(biāo)的兩種不同方法。下面讓我們分析一下序列化和外部化之間的主要區(qū)別。

通過Serializable接口對(duì)對(duì)象序列化的支持是內(nèi)建于核心 API 的,但是java.io.Externalizable的所有實(shí)現(xiàn)者必須提供讀取和寫出的實(shí)現(xiàn)。Java 已經(jīng)具有了對(duì)序列化的內(nèi)建支持,也就是說只要制作自己的類java.io.SerializableJava 就會(huì)試圖存儲(chǔ)和重組你的對(duì)象。如果使用外部化,你就可以選擇完全由自己完成讀取和寫出的工作,Java 對(duì)外部化所提供的唯一支持是接口:

voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)

現(xiàn)在如何實(shí)現(xiàn)readExternal() writeExternal() 就完全看你自己了。

序列化會(huì)自動(dòng)存儲(chǔ)必要的信息,用以反序列化被存儲(chǔ)的實(shí)例,而外部化則只保存被存儲(chǔ)的類的標(biāo)識(shí)。當(dāng)你通過java.io.Serializable接口序列化一個(gè)對(duì)象時(shí),有關(guān)類的信息,比如它的屬性和這些屬性的類型,都與實(shí)例數(shù)據(jù)一起被存儲(chǔ)起來。在選擇走Externalizable這條路時(shí),Java 只存儲(chǔ)有關(guān)每個(gè)被存儲(chǔ)類型的非常少的信息。

每個(gè)接口的優(yōu)點(diǎn)和缺點(diǎn)

Serializable
接口

·
優(yōu)點(diǎn):內(nèi)建支持

·
優(yōu)點(diǎn):易于實(shí)現(xiàn)

·
缺點(diǎn):占用空間過大

·
缺點(diǎn):由于額外的開銷導(dǎo)致速度變比較慢

Externalizable
接口

·
優(yōu)點(diǎn):開銷較少(程序員決定存儲(chǔ)什么)

·
優(yōu)點(diǎn):可能的速度提升

·
缺點(diǎn):虛擬機(jī)不提供任何幫助,也就是說所有的工作都落到了開發(fā)人員的肩上。

在兩者之間如何選擇要根據(jù)應(yīng)用程序的需求來定。Serializable通常是最簡(jiǎn)單的解決方案,但是它可能會(huì)導(dǎo)致出現(xiàn)不可接受的性能問題或空間問題;在出現(xiàn)這些問題的情況下,Externalizable可能是一條可行之路。

要記住一點(diǎn),如果一個(gè)類是可外部化的(Externalizable),那么Externalizable方法將被用于序列化類的實(shí)例,即使這個(gè)類型提供了Serializable方法:

private void writeObject()
private void readObject()

再補(bǔ)充一點(diǎn):

equals/hashcode
查看JDK文檔,大致是用于你可以自己定義兩個(gè)對(duì)象何時(shí)相等(equals)。例如你可以定義身份證相同的兩個(gè)Person對(duì)象是相等的。重載equals同時(shí),必須重寫hashCode

Serializable
接口是表明這個(gè)對(duì)象可以序列化,或者說可以把對(duì)象從內(nèi)存中寫入文件,或者通過網(wǎng)絡(luò)傳輸。這是EJB規(guī)范的要求,保證可以這些對(duì)象在網(wǎng)絡(luò)傳輸,進(jìn)行遠(yuǎn)程調(diào)用
重寫hashCode是因?yàn)椋?/span>hibernate有自己的hashCode算法,主要是用來區(qū)分pojo的各種狀態(tài),比如游離態(tài)等等。
序列化的接口最好每個(gè)pojo都實(shí)現(xiàn),不一定非要復(fù)合主鍵。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java對(duì)象的序列化和反序列化實(shí)踐
java序列化機(jī)制學(xué)習(xí)
比較java.io.Externalizable和java.io.Serializable.doc
Java程序員必備:序列化全方位解析
Java 序列化深入分析
講真,下次打死我也不敢隨便改serialVersionUID了
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服