javan

          i like java
          隨筆 - 0, 文章 - 28, 評論 - 2, 引用 - 0
          數(shù)據(jù)加載中……

          hibernate中使用serializable接口

          目的:將二級緩存中的內(nèi)容持久化保存下來,便于恢復(fù)緩存的信息,hibernate的緩存機制通過使用序列化,斷定應(yīng)該是基于序列化的緩存,如沒有serializable接口,在序列化時,使用objectOutputStream的write(object)方法將對象保存到文件時將會出現(xiàn)異常

          java中常見的幾個類(如:Interger、String等),都實現(xiàn)了serializable接口


          接口 java.io.Serializable

          public interface Serializable

          實現(xiàn) java.io.Serializable 接口的類是可序列化的。沒有實現(xiàn)此接口的類將不能使它們的任一狀態(tài)被序列化或逆序列化。序列化類的所有子類本身都是可序列化的。這個序列化接口沒有任何方法和域,僅用于標識序列化的語意。


          控制序列化的時候還可能會碰到,要禁止Java的序列化機制自動存取某個子對象的情況。這種需求是很常見的,你肯定不會希望把口令之類敏感信息也序列化了。因為一旦序列化了,別人就能通過分析文件和截獲網(wǎng)絡(luò)傳輸來進行破解,這樣即便訪問權(quán)限是private的也保不住了。.
          .

           序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。
          序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implements Serializable只 是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象 流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。

          序列化:序列化是將對象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^程。例如,可以序列化一個對象,然后使用 HTTP 通過 Internet 在客戶端和服務(wù)器之間傳輸該對象。在另一端,反序列化將從該流重新構(gòu)造對象。
          是對象永久化的一種機制。

          確切的說應(yīng)該是對象的序列化,一般程序在運行時,產(chǎn)生對象,這些對象隨著程序的停止運行而消失,但如果我們想把某些對象(因為是對象,所以有各自不同的特 性)保存下來,在程序終止運行后,這些對象仍然存在,可以在程序再次運行時讀取這些對象的值,或者在其他程序中利用這些保存下來的對象。這種情況下就要用 到對象的序列化。

          只有序列化的對象才可以存儲在存儲設(shè)備上。為了對象的序列化而需要繼承的接口也只是一個象征性的接口而已,也就是說繼承這個接口說明這個對象可以被序列化 了,沒有其他的目的。之所以需要對象序列化,是因為有時候?qū)ο笮枰诰W(wǎng)絡(luò)上傳輸,傳輸?shù)臅r候需要這種序列化處理,從服務(wù)器硬盤上把序列化的對象取出,然后 通過網(wǎng)絡(luò)傳到客戶端,再由客戶端把序列化的對象讀入內(nèi)存,執(zhí)行相應(yīng)的處理。

             對象序列化是java的一個特征,通過該特征可以將對象寫作一組字 節(jié)碼,當在其他位置讀到這些字節(jié)碼時,可以依此創(chuàng)建一個新的對象,而且新對象的狀態(tài)與原對象完全相同。為了實現(xiàn)對象序列化,要求必須能夠訪問類的私有變 量,從而保證對象狀態(tài)能夠正確的得以保存和恢復(fù)。相應(yīng)的,對象序列化API能夠在對象重建時,將這些值還原給私有的數(shù)據(jù)成員。這是對java語言訪問權(quán)限的挑戰(zhàn)。通常用在服務(wù)器客戶端的對象交換上面,另外就是在本機的存儲。

          對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整性和可傳遞性。譬如通過網(wǎng)絡(luò)傳輸,或者把一個對象保存成一個文件的時候,要實現(xiàn)序列化接口 。

          即使你沒有用過對象序列化(serialization),你可能也知道它。但你是否知道 Java 還支持另外一種形式的對象持久化,外部化(externalization)?

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

          public interface Serializable {}

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


          比較java.io.Externalizable和java.io.Serializable
          [URL]http://www.zdnet.com.cn/developer/code/story/0,3800066897,39304080,00.htm[/URL]

          即使你沒有用過對象序列化(serialization),你可能也知道它。但你是否知道 Java 還支持另外一種形式的對象持久化,外部化(externalization)?

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

          public interface Serializable {}

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

          序列化和外部化的主要區(qū)別

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

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

          voidreadExternal(ObjectInput in)
          void writeExternal(ObjectOutput out)

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

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

          每個接口的優(yōu)點和缺點

          Serializable接口

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

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

          · 缺點:占用空間過大

          · 缺點:由于額外的開銷導致速度變比較慢

          Externalizable接口

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

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

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

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

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

          private void writeObject()
          private void readObject()


          posted on 2009-06-09 11:22 whl 閱讀(268) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 马鞍山市| 巴彦淖尔市| 工布江达县| 江达县| 威远县| 肇源县| 芒康县| 通河县| 四川省| 安宁市| 花莲县| 南皮县| 安吉县| 通河县| 闻喜县| 延庆县| 财经| 新闻| 合山市| 灵川县| 虎林市| 江华| 青川县| 安徽省| 镇赉县| 武功县| 封开县| 大港区| 西林县| 沙田区| 保靖县| 盐山县| 新安县| 金昌市| 武乡县| 莱阳市| 万安县| 汝州市| 滨州市| 益阳市| 罗定市|