熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

Java中的強大武器--對象的序列化

2013-11-23 17:53:52  來源: Javascript 

  所謂對象序列化就是將對象的狀態轉換成字節流以後可以通過這些值再生成相同狀態的對象這個過程也可以通過網絡實現可以先在Windows機器上創建一個對象對其序列化然後通過網絡發給一台Unix機器然後在那裡准確無誤地重新裝配是不是很神奇
  
  也許你會說只了解一點點但從來沒有接觸過其實未必如此RMISocketJMSEJB你總該用過一種吧彼此為什麼能夠傳遞Java對象當然都是對象序列化機制的功勞
  
  第一次使用Java的對象序列化是做某項目當時要求把幾棵非常復雜的樹(JTree)及相應的數據保存下來(就是我們常用的保存功能)以便下次運行程序時可以繼續上次的操作
  
  那時XML技術在網上非常的熱而且功能也強大再加上樹的結構本來就和XML存儲數據的格式很像作為一項對新技術比較有興趣的我當然很想嘗試一下不過經過仔細分析發現如果采用XML保存數據後果真是難以想象哪棵樹的哪個節點被展開展開到第幾級節點當前的屬性是什麼真是不知該用ABC還是用來表示
  
  還好發現了Java的對象序列化機制問題迎刃而解只需簡單的將每棵樹的根節點序列化保存到硬盤上下次再通過反序列化後的根節點就可以輕松的構造出和原來一模一樣的樹來
  
  其實保存數據尤其是復雜數據的保存正是對象序列化的典型應用最近另一個項目就遇到了需要對非常復雜的數據進行存取通過使用對象的序列化問題同樣化難為簡
  
  對象的序列化還有另一個容易被大家忽略的功能就是對象復制(Clone)Java中通過Clone機制可以復制大部分的對象但是眾所周知Clone有深層Clone和淺層Clone如果你的對象非常非常復雜假設有個層的Collection(誇張了點)如果你想實現深層Clone真是不敢想象如果使用序列化不會超過行代碼就可以解決
  
  還有就是Swing組件如果你有兩個很象很象(或是一模一樣)的比較難以構造的Swing組件你該怎麼辦也許你想到了Clone但是偏偏Java的Swing組件沒有提供Clone方法別急使用序列化行代碼搞定
  
  ByteArrayOutputStream
  byteOut = new ByteArrayOutputStream();
  ObjectOutputStream out
  = new ObjectOutputStream(byteOut);
  outwriteObject(combo);
  
  ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOuttoByteArray());
  ObjectInputStream in
  =new ObjectInputStream(byteIn);
  JComboBox comb = (JComboBox)inreadObject();
  
  雖然Java的序列化非常簡單強大但是要用好還有很多地方需要注意比如曾經序列化了一個對象可由於某種原因該類做了一點點改動然後重新被編譯那麼這時反序列化剛才的對象將會出現異常
  
  你可以通過添加serialVersionUID屬性來解決這個問題如果你的類是個單態(Singleton)類是否允許用戶通過序列化機制復制該類如果不允許你需要謹慎對待該類的實現
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25301.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.