<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    NewMoring

    與Java同路,贏在未來。

    統(tǒng)計

    積分與排名

    http://bbs.javawind.net/index.jspx

    http://www.chubeibao.com/bbs/index.php

    http://www.java2000.net/

    http://www.javaeye.com/

    http://www.javathinker.org/index.jsp

    http://www.programbbs.com/bbs/index.asp

    最新評論

    java Serializable 類 序列化1《轉(zhuǎn)帖》

    1.5 定義類的可序列化域
    可用兩種不同的方式來定義類的可序列化域。類的可序列化域被缺省定義為非瞬態(tài)和非靜態(tài)域。 通過在 Serializable 類中聲明一個指定的域 serialPersistentFields,即可覆蓋該缺省值。 該域的初始化必須用 ObjectStreamField 對象的數(shù)組來完成,該對象列出了可序列化域的名稱和類型。該域的修飾符應(yīng)為 private、static 和 final。
    例如,以下聲明將復(fù)制缺省行為。
    class List implements Serializable {
        List next;
        private static final ObjectStreamField[] serialPersistentFields
                     = {new ObjectStreamField("next", List.class)};

    }
    用 serialPersistentFields 為某個類定義可序列化域后,即無需再將可序列化域限制在當(dāng)前 Serializable 類的定義之內(nèi)。利用第 1.7 節(jié),"訪問類的可序列化域" 中描述的接口,Serializable 類的 writeObject 和 readObject 方法可將該類的當(dāng)前實(shí)現(xiàn)映射到其可序列化域。因此,后續(xù)版本中可以改變 Serializable 類的域,但前提是保持與版本兼容的 Serializable 域的映射。

    1.6 對類的可序列化域和數(shù)據(jù)存檔
    對類的可序列化狀態(tài)進(jìn)行存檔以使其與 Serializable 類的其它實(shí)現(xiàn)間可互操作,或者對類演變進(jìn)行存檔,這些都非常必要。對可序列化域進(jìn)行存檔可幫助用戶最終確定該域是否應(yīng)序列化。 序列化 javadoc 標(biāo)記 @serial、@serialField 和 @serialData 可提供對源代碼中 Serializable 類的序列化形式進(jìn)行存檔的方法。

    對于缺省的可序列化域,@serial 標(biāo)記應(yīng)放在 javadoc 注釋中。語法如下:@serial field-description 其中可選項(xiàng) field-description 描述域及其容許值的含義。 field-description 可跨多行。當(dāng)初始版本中增加一個域時,@since 標(biāo)記指出所添域的版本。@serial 的 field-description 提供針對序列化的文檔。在序列化形式文檔內(nèi),field-description 將被添加到 javadoc 注釋中。
    @serialField 標(biāo)記用于對 serialPersistentFields 數(shù)組的 ObjectStreamField 組件進(jìn)行存檔。每個 ObjectStreamField 組件都應(yīng)使用其中的一個標(biāo)記。語法如下:@serialField field-name field-type field-description
    @serialData 標(biāo)記描述寫入或讀取數(shù)據(jù)的次序和類型。該標(biāo)記描述 writeObject 所寫入的可選數(shù)據(jù)或 Externalizable.writeExternal 方法所寫入的所有數(shù)據(jù)的次序或類型。語法如下:@serialData data-description
    javadoc 應(yīng)用程序識別序列化 javadoc 標(biāo)記并為每個 Serializable 和 Externalizable 類生成說明文字。有關(guān)這些標(biāo)記用法的示例,參見第 C.1 節(jié) "java.io.File 可替代實(shí)現(xiàn)的示例。"

    當(dāng)某個類被聲明為 Serializable 時,即通過可序列化域及可選數(shù)據(jù)(按名稱和類型)定義了該對象的可序列化狀態(tài)。可選數(shù)據(jù)只能用 Serializable 類中的 writeObject 方法顯式寫入,而其讀取則可通過 Serializable 類和 readObject 方法進(jìn)行。否則,序列化將跳過無法讀取的可選數(shù)據(jù)。

    當(dāng)一個類被聲明為 Externalizable 時,通過類自身寫入流的數(shù)據(jù)即定義了該類的序列化狀態(tài)。 該類必須指定順序、類型及寫入流的每個數(shù)據(jù)的含義。同時還必須處理其自身的演變,從而可讀取以前版本所寫入的數(shù)據(jù),或?qū)懭胍郧鞍姹舅茏x取的數(shù)據(jù)。在存儲和恢復(fù)數(shù)據(jù)時,該類必須與父類相一致。必須指定流中父類數(shù)據(jù)的位置。

    類的設(shè)計者必須確保為類存儲的信息對于持久性是合適的,而且遵循為實(shí)現(xiàn)序列化的互操作性和演變而指定的序列化規(guī)則。第 5 章“可序列化對象的版本演變”對類的演變進(jìn)行了更詳細(xì)的說明。

    1.10 Serializable 接口
    Serialization 對象生成流,其中提供有關(guān)所存對象的 JavaTM 類的信息。對于可序列化對象,即使存在該類的不同(但兼容)版本的實(shí)現(xiàn),也要保持足夠的信息以恢復(fù)這些對象。定義 Serializable 接口可以標(biāo)識實(shí)現(xiàn)可序列化協(xié)議的類:


    package java.io;

    public interface Serializable {};

    Serializable 類必須具備如下功能:

    實(shí)現(xiàn) java.io.Serializable 接口
    標(biāo)識應(yīng)序列化的域
    (使用 serialPersistentFields 成員以顯式聲明其可序列化,或者使用瞬態(tài)關(guān)鍵字來指示非序列域。)
    可訪問其第一個非序列化父類的無參數(shù)構(gòu)造函數(shù)。
    該類可根據(jù)需要定義如下方法:

    writeObject 方法,用于控制要保存哪些信息或?qū)⒏郊有畔⑻砑拥搅髦?
    readObject 方法,用于讀取由相應(yīng) writeObject 方法寫入的信息,或在對象恢復(fù)后更新其狀態(tài)
    writeReplace 方法,用于允許類指定寫入流的替換對象
    readResolve 方法,用于允許類為剛從流中讀取的對象指定替換對象
    ObjectOutputStream 和 ObjectInputStream 支持所操作的可序列化類的演變(允許類發(fā)生改變以兼容早期版本的類)。有關(guān)實(shí)現(xiàn)兼容變化的機(jī)制的信息,參見第 5.5 節(jié)“兼容的 JavaTM 類型演變”。
    --------------------------------------------------------------------------
    class ObjectYouWannaSave implements Serializable{
       int x; int y;
       SubObject so = new SubObject();
       ..........
    }

    class SubObject implements Serializable{
       String s = "abc"; //String is OK, because String is java.io.Serializable
    }

    public class Save{ // in Save.java
       public void main(String[] args) {
          ObjectYouWannaSave original = new ObjectYouWannaSave();
          original.x = -1; original.y = 100; .....
         
          ObjectOutputStream out = null;
          try{
            out = new ObjectOutputStream(new FileOutputStream(new File("c:/save.dat")));
            out.writeObject(original);
          }catch(Exceptione){
          }finally{
            try{out.close();}catch(Exception e){}
          }
       }
    }

    public class Read{ // in Read.java
       public void main(String[] args) {
          ObjectInputStream in = null;
          try{
            out = new ObjectInStream(new FileInStream(new File("c:/save.dat")));
            ObjectYouWannaSave o = (ObjectYouWannaSave)in.readObject();
            System.out.println("x="+o.x);
            System.out.println("subobject.string=" + o.so.s);
            ........
          }catch(Exceptione){
          }finally{
            try{in.close();}catch(Exception e){}
          }
       }
    }

    這是個最簡單的例子,先運(yùn)行Save,以后什么時候運(yùn)行Read都可以(只要c:\save.dat文件還存在就可以了)
    --------------------------------------------------
    對象的壽命通常隨著生成該對象的程序終止而終止,有時候,可能需要將對象的狀態(tài)保存下來,在需要的時候
    再將對象恢復(fù),我們把對象的這種記錄自己狀態(tài)的以便將來再生的能力,叫做對象的持續(xù)性(PERSISTENCE),
    對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己,這個過程叫對象的串行化Serializable。串行化的主要任務(wù)是寫
    出對象實(shí)例變量的值。如果變量是另一個對象的引用,則引用的對象也要串行化,這是個遞歸過程。
    --------------------------------------------------------------------
    java.io.Serializable interface是一個較為特殊的接口:
    The serialization interface has no methods or fields and serves
    only to identify the semantics of being serializable
    即:它主要是一個用于通知JVM的標(biāo)志

    class X implements java.io.Serializable{...}

    如果你要定制你自己的serializable行為,你應(yīng)該在X中實(shí)現(xiàn)以下2個方法:
     private void writeObject(java.io.ObjectOutputStream out)
         throws IOException
     private void readObject(java.io.ObjectInputStream in)
         throws IOException, ClassNotFoundException;

    否則將按缺省的策略進(jìn)行。

    由于上述2個方法是private的,所以在某些情況下,可以使用
    java.io.Serializable的子接口java.io.Externalizable,
    在這個interface中有2個public方法:

    public void writeExternal(ObjectOutput out)
                       throws IOException

    public void readExternal(ObjectInput in)
                      throws IOException,
                             ClassNotFoundException


    ----------------------------------------------------------------------------
    Serializable是一個串行化接口,它沒有任何的屬性和方法,一個類實(shí)現(xiàn)了串行化接口,就表明
    該類具有持久性,通過WriteObjcet可將其持久保存在磁盤,在需要時,可用ReadObject從磁盤中讀出,次時,對象的狀態(tài)和存入似的相同。上面給出的列子比較簡單,可通過串行化保存一個
    鏈表對象,它的每個節(jié)點(diǎn)數(shù)據(jù)也會被保存。 當(dāng)然,串行化接口還有其他用途,例如HTTP隧道等

    -----------------------------------------------------------------------
    對象序列化的持續(xù)性要和永久對象分別開。序列化只能達(dá)到有線持續(xù)性
    在同一個jvm上可以重構(gòu)對象的內(nèi)容,達(dá)到持續(xù)性
    ---------------------------------------------------------------------
    java序列化主要是用于兩個方面:
    一個是java的RMI(遠(yuǎn)程方法調(diào)用-Remote method invocation),你可以使用別人機(jī)器上的對象就像在你自己的機(jī)器上使用它一樣(通過序列化),另外,在使用javabean時也需要使用序列化,序列化主要就是使用在這兩方面。
    -------------------------------------------------------------
    所謂序列化就是把把對象以一個代碼串的形式表示出來,
    這樣可以保存到磁盤或則通過網(wǎng)絡(luò)傳輸,接受方可以在把代碼串恢復(fù)成對象
    具體的串形化方法可以自己寫,接收放就可以根據(jù)您串形的規(guī)則把對象恢復(fù)出來
    --------------------------------------------------------------------
    序列化是把一個對象的狀態(tài)寫入一個字節(jié)流的過程,它執(zhí)行RMI,RMI允許一臺機(jī)器上的JAVA對象調(diào)用不同機(jī)器上的JAVA對象方法,對象可以作為參數(shù)提供給那個遠(yuǎn)程方法,發(fā)送機(jī)序列化該對象并傳送它,接收機(jī)執(zhí)行反序列化。
    序列化和反序列化的關(guān)系圖表可形成包含循環(huán)引用的順序圖表。這是整個序列化的總體思想。
    而Serializable接口屬于支持序列化的一個接口,只有一個實(shí)現(xiàn)它的對象可以被序列化工具存儲和回復(fù),Serializable接口沒有定義任何成員,只用來表示一個累可以被序列化,若該類可以序列化,那么它的所有子類都可以。
    下面是關(guān)于序列化的一個實(shí)例:
    [b:a55efb5f91]程序名稱:SerializationDemo.java
    程序主題:實(shí)現(xiàn)對象的序列化和反序列化
    程序說明:該程序由實(shí)例化一個MyClass類的對象開始,該對象有三個實(shí)例變量,類型分別為String、int、double,是希望存儲和恢復(fù)的信息。[/b:a55efb5f91]

    [code:1:a55efb5f91]

    import java.io.*;

    public class SerializationDemo{
            public static void main(String args[]){

    //Object serialization
    try{
    MyClass object1=new MyClass("Hello",-7,2.7e10);
    System.out.println("object1:"+object1);
    FileOutputStream fos=new FileOutputStream("serial");
    ObjectOutputStream oos=new ObjectOutputStream(fos);
    oos.writeObject(object1);
    oos.flush();
    oos.close();
    }
    catch(Exception e){
    System.out.println("Exception during serialization:"+e);
    System.exit(0);
    }

    //Object deserialization
    try{
    MyClass object2;
    FileInputStream fis=new FileInputStream("serial");
    ObjectInputStream ois=new ObjectInputStream(fis);
    object2=(MyClass)ois.readObject();
    ois.close();
    System.out.println("object2:"+object2);
    }
    catch(Exception e){
    System.out.println("Exception during deserialization:"+e);
    System.exit(0);
    }
    }
    }

    class MyClass implements Serializable{
    String s;
    int i;
    double d;
    public MyClass(String s,int i,double d){
    this.s=s;
    this.i=i;
    this.d=d;
    }
    public String toString(){
    return "s="+s+";i="+i+";d="+d;
    }
    }
    [/code:1:a55efb5f91]

    程序運(yùn)行結(jié)果:object1和object2的實(shí)例變量是一樣的,輸出如下:[code:1:a55efb5f91]object1:s=Hello;i=-7;d=2.7E10
    object2:s=Hello;i=-7;d=2.7E10[/code:1:a55efb5f91]
    --------------------------------------------------------------------------------
    Object serialization的定義:
    Object serialization 允許你將實(shí)現(xiàn)了Serializable接口的對象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲以備以后重新生成原來的對象。 

    serialization不但可以在本機(jī)做,而且可以經(jīng)由網(wǎng)絡(luò)操作(就是貓小說的RMI)。這個好處是很大的----因?yàn)樗詣悠帘瘟瞬僮飨到y(tǒng)的差異,字節(jié)順序(用Unix下的c開發(fā)過網(wǎng)絡(luò)編程的人應(yīng)該知道這個概念,我就容易在這上面犯錯)等。比如,在Window平臺生成一個對象并序列化之,然后通過網(wǎng)絡(luò)傳到一臺Unix機(jī)器上,然后可以在這臺Unix機(jī)器上正確地重構(gòu)這個對象。


    Object serialization主要用來支持2種主要的特性:
    1。Java的RMI(remote method invocation).RMI允許象在本機(jī)上一樣操作遠(yuǎn)程機(jī)器上的對象。當(dāng)發(fā)送消息給遠(yuǎn)程對象時,就需要用到serializaiton機(jī)制來發(fā)送參數(shù)和接收返回直。

    2。Java的JavaBeans.   Bean的狀態(tài)信息通常是在設(shè)計時配置的。Bean的狀態(tài)信息必須被存起來,以便當(dāng)程序運(yùn)行時能恢復(fù)這些狀態(tài)信息。這也需要serializaiton機(jī)制。

     

    二。持久化
    持久化應(yīng)該是英文里的persistence.但是Java語言里現(xiàn)在只支持lightweight persistence,就是輕量級持久化,這是通過serialization機(jī)制來實(shí)現(xiàn)的。

    persistence是指一個對象的生命周期不由程序是否執(zhí)行來決定,即使是在程序終止時這個對象也存在。它把一個serializable的對象寫到磁盤(本機(jī)或其他機(jī)器上的非RAM存儲器),并在程序重新調(diào)用時再讀取對象到通常的RAM存儲器。

    為什么說Java的serialization機(jī)制實(shí)現(xiàn)的是lightweight persistence?因?yàn)槟惚仨氾@式的序列化和反序列化程序里的對象;而不是直接由一個關(guān)鍵詞來定義一個對象是序列化的然后由系統(tǒng)做相應(yīng)的處理。  如果以后的Java版本出現(xiàn)一個新的關(guān)鍵字來實(shí)現(xiàn)這種機(jī)制,比如就是persistence,如果我用

    persistence  (String s="chinaunix")

    然后系統(tǒng)自動做上面程序里的那些處理,那么Java就實(shí)現(xiàn)了persistence.

    posted on 2009-05-27 14:16 清晨 閱讀(755) 評論(0)  編輯  收藏 所屬分類: java語言的相關(guān)問題

    主站蜘蛛池模板: 久久狠狠躁免费观看| 永久免费精品影视网站| 久久永久免费人妻精品下载| 亚洲精品网站在线观看不卡无广告| 一区二区亚洲精品精华液| 国产精品视频永久免费播放| 国产亚洲国产bv网站在线| 成人奭片免费观看| 国产亚洲精品bv在线观看| 女人与禽交视频免费看| 亚洲无码一区二区三区| 国产麻豆免费观看91| 美女视频黄a视频全免费网站色| 国产乱辈通伦影片在线播放亚洲 | 亚洲一区在线免费观看| 亚洲免费在线观看视频| 99999久久久久久亚洲| 免费看大美女大黄大色| 黄色网址免费在线| 亚洲精品乱码久久久久久| 99re视频精品全部免费| 亚洲天堂2016| 伊人久久亚洲综合影院| 中文字幕视频免费在线观看 | 亚洲大尺度无码专区尤物| 91精品免费观看| 亚洲国产成人精品无码区花野真一 | 激情亚洲一区国产精品| 日韩一区二区三区免费体验| jizz日本免费| 亚洲精品综合久久中文字幕| 日本不卡视频免费| 一级特黄录像免费播放肥| 亚洲妓女综合网99| 日本久久久免费高清| 日本一道本不卡免费 | 四虎影视在线看免费观看| 亚洲第一区香蕉_国产a| 成年人免费观看视频网站| 一级做a毛片免费视频| 亚洲精品中文字幕无码AV|