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

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

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

    隨筆-9  評論-168  文章-266  trackbacks-0
    1、序列化是干什么的?
           簡單說就是為了保存在內存中的各種對象的狀態(也就是實例變量,不是方法),并且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保存object states,但是Java給你提供一種應該比你自己好的保存對象狀態的機制,那就是序列化。

    2、什么情況下需要序列化  
        a)當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
        b)當你想用套接字在網絡上傳送對象的時候;
        c)當你想通過RMI傳輸對象的時候;

    3、當對一個對象實現序列化時,究竟發生了什么?
        在沒有序列化前,每個保存在堆(Heap)中的對象都有相應的狀態(state),即實例變量(instance ariable)比如:

    1Foo  myFoo = new Foo();   
    2myFoo .setWidth(37);   
    3myFoo.setHeight(70);   

           當 通過下面的代碼序列化之后,MyFoo對象中的width和Height實例變量的值(37,70)都被保存到foo.ser文件中,這樣以后又可以把它 從文件中讀出來,重新在堆中創建原來的對象。當然保存時候不僅僅是保存對象的實例變量的值,JVM還要保存一些小量信息,比如類的類型等以便恢復原來的對 象。

    1FileOutputStream fs = new FileOutputStream("foo.ser");   
    2ObjectOutputStream os = new ObjectOutputStream(fs);   
    3os.writeObject(myFoo);   

    4、實現序列化(保存到一個文件)的步驟
          
    a)Make a FileOutputStream   
    1FileOutputStream fs = new FileOutputStream("foo.ser");     

     b)Make a ObjectOutputStream   
    1ObjectOutputStream os =  new ObjectOutputStream(fs);    

      c)write the object
    1os.writeObject(myObject1);   
    2os.writeObject(myObject2);   
    3os.writeObject(myObject3); 

    d) close the ObjectOutputStream
    1os.close();  

    5、舉例說明
     1import java.io.*;
     2
     3   
     4public class  Box implements Serializable   
     5{   
     6    private int width;   
     7    private int height;   
     8   
     9    public void setWidth(int width){   
    10        this.width  = width;   
    11    }
       
    12    public void setHeight(int height){   
    13        this.height = height;   
    14    }
       
    15   
    16    public static void main(String[] args){   
    17        Box myBox = new Box();   
    18        myBox.setWidth(50);   
    19        myBox.setHeight(30);   
    20   
    21        try{   
    22            FileOutputStream fs = new FileOutputStream("foo.ser");   
    23            ObjectOutputStream os =  new ObjectOutputStream(fs);   
    24            os.writeObject(myBox);   
    25            os.close();   
    26        }
    catch(Exception ex){   
    27            ex.printStackTrace();   
    28        }
       
    29    }
       
    30       
    31}
      
    32
    33

    6、相關注意事項
        a)序列化時,只對對象的狀態進行保存,而不管對象的方法;
        b)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable接口;
        c)當一個對象的實例變量引用其他對象,序列化該對象時也把引用對象進行序列化;
        d)并非所有的對象都可以序列化,,至于為什么不可以,有很多原因了,比如:
            1.安全方面的原因,比如一個對象擁有private,public等field,對于一個要傳輸的對象,比如寫到文件,或者進行rmi傳輸  等等,在序列化進行傳輸的過程中,這個對象的private等域是不受保護的。
           2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者保存,也無法對他們進行重新的資源分  配,而且,也是沒有必要這樣實現。

                                                                               ----------轉http://xiebh.javaeye.com/blog/121311
    posted on 2007-11-16 10:46 紫蝶∏飛揚↗ 閱讀(282) 評論(0)  編輯  收藏 所屬分類: 隨想
    主站蜘蛛池模板: 亚洲色无码专区在线观看| 国产偷国产偷亚洲高清日韩| 久久青青成人亚洲精品 | 亚洲av无码成人精品国产| 成年黄网站色大免费全看| 亚洲国产成人精品无码区在线秒播 | 亚洲国产精品乱码在线观看97| 免费精品一区二区三区第35| 亚洲av无码一区二区三区乱子伦 | 亚洲熟女精品中文字幕| 天天摸夜夜摸成人免费视频| 亚洲无人区码一二三码区别图片 | 亚洲国产日韩成人综合天堂| sihu国产精品永久免费| 人人狠狠综合久久亚洲婷婷| 无码人妻一区二区三区免费n鬼沢| 亚洲三级电影网址| 日韩亚洲国产高清免费视频| 亚洲日本一线产区和二线| 免费a在线观看播放| 男女作爱在线播放免费网站| 亚洲国产成人超福利久久精品| 免费观看的a级毛片的网站| 五月天婷婷精品免费视频| 亚洲免费人成在线视频观看| 在线看片免费人成视久网| 亚洲国产精品无码久久| 亚洲永久精品ww47| 2021免费日韩视频网| 极品美女一级毛片免费| 久久精品视频亚洲| 免费无遮挡无码视频网站| 在线观看片免费人成视频播放| 亚洲欧洲日韩综合| 国产一级淫片视频免费看| 免费在线看污视频| 亚洲精华国产精华精华液网站| 区久久AAA片69亚洲| 国产一卡2卡3卡4卡无卡免费视频| 日本精品久久久久久久久免费| 久久久久亚洲精品天堂|