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

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

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

    Chan Chen Coding...

    對象的串行化(Serialization)

    一、串行化的概念和目的 
    1.什么是串行化 
                對象的壽命通常隨著生成該對象的程序的終止而終止。有時候,可能需要將對象的狀態(tài)保存下來,在需要時再將對象恢復(fù)。我們把對象的這種能記錄自己的狀態(tài)以便將來再生的能力。叫作對象的持續(xù)性(persistence)。對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己 ,這個過程叫對象的串行化(Serialization) 。串行化的主要任務(wù)是寫出對象實例變量的數(shù)值。如果交量是另一對象的引用,則引用的對象也要串行化。這個過程是遞歸的,串行化可能要涉及一個復(fù)雜樹結(jié)構(gòu)的單行化,包括原有對象、對象的對象、對象的對象的對象等等。對象所有權(quán)的層次結(jié)構(gòu)稱為圖表(graph)。 
    2.串行化的目的 
                Java對象的單行化的目標(biāo)是為Java的運(yùn)行環(huán)境提供一組特性,如下所示: 
    1)       盡量保持對象串行化的簡單扼要 ,但要提供一種途徑使其可根據(jù)開發(fā)者的要求進(jìn)行擴(kuò)展或定制。 
    2)       串行化機(jī)制應(yīng)嚴(yán)格遵守Java的對象模型 。對象的串行化狀態(tài)中應(yīng)該存有所有的關(guān)于種類的安全特性的信息。 
    3)       對象的串行化機(jī)制應(yīng)支持Java的對象持續(xù)性。 
    4)       對象的串行化機(jī)制應(yīng)有足夠的 可擴(kuò)展能力以支持對象的遠(yuǎn)程方法調(diào)用(RMI)。 
    5)       對象串行化應(yīng)允許對象定義自身 的格式即其自身的數(shù)據(jù)流表示形式,可外部化接口來完成這項功能。
     
     
     
    二、串行化方法 
                從JDK1.1開始,Java語言提供了對象串行化機(jī)制 ,在java.io包中,接口Serialization用來作為實現(xiàn)對象串行化的工具 ,只有實現(xiàn)了Serialization的類的對象才可以被串行化。 
                Serializable接口中沒有任何的方法。當(dāng)一個類聲明要實現(xiàn)Serializable接口時,只是表明該類參加串行化協(xié)議,而不需要實現(xiàn)任何特殊的方法。下面我們通過實例介紹如何對對象進(jìn)行串行化。 
    1.定義一個可串行化對象 
                一個類,如果要使其對象可以被串行化,必須實現(xiàn)Serializable接口。我們定義一個類Student如下:

     

    import java.io.Serializable;   
      
    public class Student implements Serializable {   
      
        int id;// 學(xué)號   
      
        String name;// 姓名   
      
        int age;// 年齡   
      
        String department; // 系別   
      
        public Student(int id, String name, int age, String department) {   
      
            this.id = id;   
      
            this.name = name;   
      
            this.age = age;   
      
            this.department = department;   
      
        }   
      
    }  

    2.構(gòu)造對象的輸入/輸出流 
                要串行化一個對象,必須與一定的對象輸出/輸入流聯(lián)系起來,通過對象輸出流將對象狀態(tài)保存下來,再通過對象輸入流將對象狀態(tài)恢復(fù)。 
                java.io包中,提供了ObjectInputStream和ObjectOutputStream將數(shù)據(jù)流功能擴(kuò)展至可讀寫對象 。在ObjectInputStream 中用readObject()方法可以直接讀取一個對象,ObjectOutputStream中用writeObject()方法可以直接將對象保存到輸出流中。

    import java.io.FileInputStream;   
    import java.io.FileOutputStream;   
    import java.io.IOException;   
    import java.io.ObjectInputStream;   
    import java.io.ObjectOutputStream;   
      
    public class ObjectSer {   
      
        public static void main(String args[]) throws IOException,   
                ClassNotFoundException {   
      
            Student stu = new Student(981036, "LiuMing", 18, "CSD");   
      
            FileOutputStream fo = new FileOutputStream("data.ser");   
      
            ObjectOutputStream so = new ObjectOutputStream(fo);   
      
            try {   
      
                so.writeObject(stu);   
      
                so.close();   
      
            } catch (IOException e) {   
                System.out.println(e);   
            }   
      
            stu = null;   
      
            FileInputStream fi = new FileInputStream("data.ser");   
      
            ObjectInputStream si = new ObjectInputStream(fi);   
      
            try {   
      
                stu = (Student) si.readObject();   
      
                si.close();   
      
            } catch (IOException e)   
      
            {   
                System.out.println(e);   
            }   
      
            System.out.println("Student Info:");   
      
            System.out.println("ID:" + stu.id);   
      
            System.out.println("Name:" + stu.name);   
      
            System.out.println("Age:" + stu.age);   
      
            System.out.println("Dep:" + stu.department);   
      
        }   
      
    }  
    運(yùn)行結(jié)果如下:
    Student Info: 

    ID:981036 

    Name:LiuMing 

    Age:18 

    Dep:CSD

     在這個例子中,我們首先定義了一個類Student,實現(xiàn)了Serializable接口 ,然后通過對象輸出流的writeObject()方法將Student對象保存到文件 data.ser中 。之后,通過對家輸入流的readObjcet()方法從文件data.ser中讀出保存下來的Student對象 。從運(yùn)行結(jié)果可以看到,通過串行化機(jī)制,可以正確地保存和恢復(fù)對象的狀態(tài)。 
    三、串行化的注意事項 
    1.串行化能保存的元素 
                串行化只能保存對象的非靜態(tài)成員交量,不能保存任何的成員方法和靜態(tài)的成員變量,而且串行化保存的只是變量的值,對于變量的任何修飾符都不能保存。 
    2.transient關(guān)鍵字 
                對于某些類型的對象,其狀態(tài)是瞬時的,這樣的對象是無法保存其狀態(tài)的。例如一個Thread對象或一個FileInputStream對象 ,對于這些字段,我們必須用transient關(guān)鍵字標(biāo)明,否則編譯器將報措。 
                另外 ,串行化可能涉及將對象存放到 磁盤上或在網(wǎng)絡(luò)上發(fā)達(dá)數(shù)據(jù),這時候就會產(chǎn)生安全問題。因為數(shù)據(jù)位于Java運(yùn)行環(huán)境之外,不在Java安全機(jī)制的控制之中。對于這些需要保密的字段,不應(yīng)保存在永久介質(zhì)中 ,或者不應(yīng)簡單地不加處理地保存下來 ,為了保證安全性。應(yīng)該在這些字段前加上transient關(guān)鍵字。


    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-11-13 11:04 Chan Chen 閱讀(163) 評論(0)  編輯  收藏 所屬分類: Scala / Java

    主站蜘蛛池模板: 99在线精品视频观看免费| 香蕉国产在线观看免费| 午夜理伦剧场免费| 国产亚洲美女精品久久久2020| 亚洲AV成人精品日韩一区| 国外成人免费高清激情视频| 久久亚洲国产成人影院| 一本无码人妻在中文字幕免费| 亚洲一区二区免费视频| 成人免费视频77777| 亚洲欧美日韩综合久久久| 日本一道本高清免费| 麻豆亚洲AV成人无码久久精品 | 久久精品国产精品亚洲下载| 一级特黄录像免费播放中文版| 国产成人毛片亚洲精品| 中文字幕无码毛片免费看| 亚洲国产一区二区三区青草影视 | 亚洲伊人色一综合网| 久草视频在线免费| 亚洲熟妇无码八V在线播放| 国产精品免费视频一区| 国产99久久久久久免费看| 久热综合在线亚洲精品| 久久WWW免费人成一看片| 亚洲av永久中文无码精品| 亚洲高清视频一视频二视频三| 久草免费福利在线| 久久狠狠高潮亚洲精品| 成年人免费视频观看| h视频免费高清在线观看| 亚洲五月六月丁香激情| 成年性生交大片免费看| 日本高清免费中文在线看| 亚洲视频在线观看免费| 国产精品免费视频网站| 日韩免费在线观看视频| 亚洲欧美乱色情图片| 亚洲精品V欧洲精品V日韩精品| 91免费人成网站在线观看18| 亚洲AV无码专区在线厂|