<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 | 亚洲AV无码AV日韩AV网站| 在线观看免费人成视频色| 亚洲精品美女在线观看播放| 国产精品免费看久久久| 亚洲爆乳无码一区二区三区| 中文无码日韩欧免费视频| 精品亚洲视频在线观看| 一本久久A久久免费精品不卡| 亚洲精品国产精品乱码不卡| 一区二区视频在线免费观看| 亚洲日韩国产精品乱| 国产成人无码免费看片软件| 国产成人亚洲精品狼色在线| a级男女仿爱免费视频| 亚洲精品免费在线观看| 亚洲美女视频免费| 亚洲欧洲免费无码| 免费人成在线观看网站品爱网日本 | 国产精品高清视亚洲一区二区| 野花高清在线电影观看免费视频| 亚洲伊人久久大香线蕉在观| 老司机在线免费视频| 亚洲AV无码成人网站在线观看| 又大又硬又爽免费视频| 一级有奶水毛片免费看| 亚洲乱码国产乱码精品精| 无码专区AAAAAA免费视频| 亚洲天堂2016| 国产91精品一区二区麻豆亚洲 | 亚洲AV综合色区无码一二三区| 在线观看免费亚洲| 18gay台湾男同亚洲男同| 免费无码国产V片在线观看| 免费一级成人毛片| 无码AV动漫精品一区二区免费| 亚洲国产精品无码久久九九| 国产伦精品一区二区免费| 亚洲av无码潮喷在线观看|