丄諦啲仇魜ヤ
          如 果 敵 人 讓 你 生 氣 , 那 說 明 你 沒 有 勝 他 的 把 握!
          posts - 6,comments - 56,trackbacks - 1

          個人看法,不一定正確
          你是女生,有沒有接觸過毛線團(tuán)
          毛線團(tuán)就是我們實現(xiàn)了Serializable接口的對象
          一個毛線團(tuán)可以抽成很長的毛線
          又可以把很長的毛線卷成毛線團(tuán)
          對應(yīng)起來就是
          一個巨大的對象可以抽成很簡單的文本表達(dá)保存起來
          需要使用這個對象的時候
          再根據(jù)這些文本生成
          Serializable 只是一個標(biāo)志,讓JVM能夠知道可以安全的把object轉(zhuǎn)化成上面老兄說的毛線團(tuán)。
          你不需要作任何code。
          Serializable 對JAVABEANS是必須的接口。
          你不需要作任何實現(xiàn)。

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

          [code:1:a55efb5f91]

          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;
           }
          }
          [/code:1:a55efb5f91]

          程序運(yùn)行結(jié)果:object1和object2的實例變量是一樣的,輸出如下:[code:1:a55efb5f91]object1:s=Hello;i=-7;d=2.7E10
          object2:s=Hello;i=-7;d=2.7E10[/code:1:a55efb5f91]
          <!--========================================================-->
          hehe
          未必是RMI啦
          持久化也是Serializable的重點(diǎn)...
          <!--========================================================-->
          //agree
          持久化是Serializable開始的目的。
          樓主有什么心得,是不是也response一下?
          <!--========================================================-->
          現(xiàn)在知道是怎么回事了-----Thank Bruce Eckel a million times for his excellent <<Think in java(Second Edition) >>.書里面講的好清楚啊。
          一。貓小寫的不大全,可能是因為我的帖子里寫的“一般在什么情況下用”這話作怪。
          我補(bǔ)充一下:
          Object serialization的定義:
          Object serialization 允許你將實現(xiàn)了Serializable接口的對象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲以備以后重新生成原來的對象。

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

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

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

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

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

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

          persistence  (String s="chinaunix")

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

          第一次寫這么多,而且是剛看了書不久寫的,錯誤和行文不當(dāng)之處多包涵。

          再次感謝貓小,sakulagi和rollingpig給的提示。
          <!--========================================================-->
          Joshua Bloch 的 "Effective Java Programming Language Guide" 里面關(guān)于 Serializable 的部分講得也很好,尤其是什么時候該用,什么時候不該用。
          <!--========================================================-->
           關(guān)于序列化處理Bean的狀態(tài)信息能不能說的詳細(xì)具體一些呢,謝謝!
          <!--========================================================-->
          這兒我沒有寫過,我想是通過序列化bean,進(jìn)行writeObject方法可以將數(shù)據(jù)寫入數(shù)據(jù)庫的一個表。
          oracle對這點(diǎn)有支持。

          posted on 2007-11-09 09:20 Crying 閱讀(344) 評論(0)  編輯  收藏 所屬分類: JAVA基礎(chǔ)
          主站蜘蛛池模板: 鲁山县| 呼玛县| 德庆县| 澎湖县| 图们市| 北京市| 舒城县| 常州市| 泰安市| 普陀区| 山东省| 松滋市| 伊通| 鹿泉市| 渝中区| 谢通门县| 兰州市| 上思县| 都匀市| 怀集县| 兴化市| 海原县| 民丰县| 醴陵市| 苏尼特右旗| 左权县| 英吉沙县| 洪洞县| 武定县| 青浦区| 泸定县| 云和县| 新兴县| 阿巴嘎旗| 蕉岭县| 台东市| 兴和县| 嘉定区| 林口县| 阳谷县| 招远市|