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

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

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

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    序列化和反序列化對象

    Posted on 2009-05-24 22:18 啥都寫點(diǎn) 閱讀(220) 評論(0)  編輯  收藏 所屬分類: J2SE
       一個大的應(yīng)用程序需要使用很多的對象,由于虛擬機(jī)內(nèi)存有限,有時不可能將所有有用的對象都放在內(nèi)存中,因此,需要將不常用的對象暫時持久化到文件中,當(dāng)需要使用該對象時,再從文件中把對象恢復(fù)到內(nèi)存,這就是對象的序列化和反序列化。

    關(guān)鍵技術(shù):
    • 需要被序列化的對象必須實現(xiàn)java.io.Serializable接口,盡管該接口沒有定義任何方法。
    • 對象輸出流ObjectOutputStream可以將對象寫入到流中,通過文件輸出流可以構(gòu)造ObjectOutputStream對象。寫對象到文件時調(diào)用writeObject方法。
    • 對象輸入流ObjectInputSteam可以從流中讀取對象到內(nèi)存,通過文件輸入流可以構(gòu)造ObjectInputStream對象。從文件讀對象到內(nèi)存時調(diào)用readObject方法,返回一個Object對象。
    • 序列化時,transient變量和類變量(靜態(tài)變量)不會被序列化。
    • 序列化時,對象按照writeObject方法的調(diào)用順序存儲在文件中,先被序列化的對象的數(shù)據(jù)在文件的前面,后被序列化的對象的數(shù)據(jù)在文件的后面。因此,在反序列化時,先讀到得對象肯定是先被序列化的對象。
     
    package book.io;


    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Date;
    /**
     * 序列化和反序列化對象
     
    */
    public class SerializeObject {
        
    //    一個內(nèi)部類,用于被序列化和反序列化。
        
    //一定要實現(xiàn)Serializable才能夠被序列化和反序列化。
        static class MyClass implements Serializable{
            
    //一般的實例變量會被序列化和反序列化
            private int a,b;
            
    //transient實例變量 不會 被序列化和反序列化
            private transient int c; 
            
    // 類變量 不會 被序列化和反序列化
            private static int d;
            
    public MyClass(){
            }
            
    public MyClass(int a, int b, int c, int d){
                
    this.a = a;
                
    this.b = b;
                
    this.c = c;
                MyClass.d 
    = d;
            }
            
    public String toString(){
                
    return this.a + "  " + this.b + "  " + this.c + "  " + MyClass.d;
            }
        }

        
    /**
         * 序列化對象到文件
         
    */
        
    public static void serialize(String fileName) throws Exception{
            
    //創(chuàng)建一個對象輸出流,將對象輸出到文件
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
            
    //序列化一個字符串對象到文件
            out.writeObject("Today:");
            
    //序列化當(dāng)前日期對象到文件
            out.writeObject(new Date());
            
    //序列化一個MyClass對象
            MyClass my1 = new MyClass(5678);
            out.writeObject(my1);
            out.close();
        }
        
    /**
         * 從文件反序列化到對象
         
    */
        
    public static void deserialize(String fileName) throws Exception{
            
    //創(chuàng)建一個對象輸入流,從文件讀取對象
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
            
    //注意讀對象時必須按照序列化對象時的順序讀,否則會出錯
            
    //讀取字符串對象
            String today = (String)(in.readObject());
            System.out.println(today);
            
    //讀日期對象
            Date date = (Date)(in.readObject());
            System.out.println(date.toString());
            
    //讀MyClass對象,并調(diào)用它的add方法。
            MyClass my1 = (MyClass)(in.readObject());
            System.out.println(my1.toString());
            in.close();
            
    //當(dāng)恢復(fù)對象的時候,對象中的所有域被自動的恢復(fù)。如果不希望某個域被序列化,可以在它前面
            
    //加上transient關(guān)鍵字,例如下面的代碼:transient int noSer = 0;
            
    //類似的,如果類中的某個域為靜態(tài),它不會被序列化。
        }
        
    /**
         * 
    @param args
         
    */
        
    public static void main(String[] args) throws Exception{
            String fileName 
    = "c:/temp/MyClass.ser";
            SerializeObject.serialize(fileName);
            
    //注釋掉第二行,只運(yùn)行下面一行,將會發(fā)現(xiàn)輸出不同
            SerializeObject.deserialize(fileName);
        }
    }

    運(yùn)行結(jié)果:

    Today:
    Sun Jul 30 11:49:38 CST 2006
    5   6   0   8



                                                                                                           --    學(xué)海無涯
            

    主站蜘蛛池模板: 亚洲欧洲在线播放| 小草在线看片免费人成视久网| 久久亚洲国产成人精品性色| 免费成人av电影| 黄页网站免费观看| 中文成人久久久久影院免费观看| 亚洲av成人中文无码专区| 亚洲国产精品日韩在线观看 | 亚洲av一本岛在线播放| 综合亚洲伊人午夜网| 国产在线19禁免费观看| 手机看黄av免费网址| 免费精品无码AV片在线观看| 野花香高清在线观看视频播放免费| 免费人成大片在线观看播放| 亚洲aⅴ无码专区在线观看春色| 亚洲三级视频在线| 亚洲精品日韩专区silk| 亚洲AV福利天堂一区二区三| 亚洲午夜福利在线观看| 美腿丝袜亚洲综合| 国产精品亚洲综合专区片高清久久久| 国产成人精品免费视频软件| 色吊丝最新永久免费观看网站| 无码少妇一区二区浪潮免费| 国产大片线上免费观看| 免费观看黄色的网站| 日本免费一区二区在线观看| 久热中文字幕在线精品免费| 18级成人毛片免费观看| 91精品啪在线观看国产线免费| 最近新韩国日本免费观看| 蜜桃视频在线观看免费视频网站WWW| 久久久久久AV无码免费网站下载 | 成人毛片免费观看视频| 性色av无码免费一区二区三区| 永久免费av无码网站韩国毛片| 在线观看AV片永久免费| 免费电视剧在线观看| 成年女人午夜毛片免费视频| 四虎影院免费在线播放|