隨筆-124  評(píng)論-49  文章-56  trackbacks-0

          序列化是把一個(gè)對(duì)象的狀態(tài)寫入一個(gè)字節(jié)流的過程,它執(zhí)行RMI,RMI允許一臺(tái)機(jī)器上的JAVA對(duì)象調(diào)用不同機(jī)器上的JAVA對(duì)象方法,對(duì)象可以作為參數(shù)提供給那個(gè)遠(yuǎn)程方法,發(fā)送機(jī)序列化該對(duì)象并傳送它,接收機(jī)執(zhí)行反序列化。
          序列化和反序列化的關(guān)系圖表可形成包含循環(huán)引用的順序圖表。這是整個(gè)序列化的總體思想。
          而Serializable接口屬于支持序列化的一個(gè)接口,只有一個(gè)實(shí)現(xiàn)它的對(duì)象可以被序列化工具存儲(chǔ)和回復(fù),Serializable接口沒有定義任何成員,只用來表示一個(gè)累可以被序列化,若該類可以序列化,那么它的所有子類都可以。
          下面是關(guān)于序列化的一個(gè)實(shí)例:
          程序名稱:SerializationDemo.java
          程序主題:實(shí)現(xiàn)對(duì)象的序列化和反序列化
          程序說明:該程序由實(shí)例化一個(gè)MyClass類的對(duì)象開始,該對(duì)象有三個(gè)實(shí)例變量,類型分別為String、int、double,是希望存儲(chǔ)和恢復(fù)的信息。

           

          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;
           }
          }

           

          程序運(yùn)行結(jié)果:object1和object2的實(shí)例變量是一樣的,輸出如下:
          object1:s=Hello;i=-7;d=2.7E10
          object2:s=Hello;i=-7;d=2.7E10


          我補(bǔ)充一下:

          Object serialization的定義:
          Object serialization 允許你將實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲(chǔ)以備以后重新生成原來的對(duì)象。 

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


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

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

           

          二。sakulagi和rollingpig說的持久化我也說一下。
          我覺得你們說的應(yīng)該是英文里的persistence.但是Java語言里現(xiàn)在只支持lightweight persistence,就是輕量級(jí)持久化,這是通過serialization機(jī)制來實(shí)現(xiàn)的。

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

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

          persistence  (String s="chinaunix")

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

          posted on 2009-11-29 21:31 junly 閱讀(217) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 会同县| 宕昌县| 抚松县| 河南省| 嫩江县| 桂东县| 清新县| 奉贤区| 德阳市| 那坡县| 巴塘县| 来凤县| 汨罗市| 平昌县| 濮阳县| 海丰县| 郯城县| 武宁县| 扎鲁特旗| 凭祥市| 拜泉县| 南和县| 北碚区| 青田县| 元江| 永丰县| 寻甸| 尤溪县| 阿克| 宁武县| 凤山县| 延庆县| 鞍山市| 监利县| 吐鲁番市| 黎川县| 封开县| 屏山县| 云林县| 绥中县| 冀州市|