国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 10:49:17
字體:
來源:轉載
供稿:網友

  所謂對象序列化就是將對象的狀態轉換成字節流,以后可以通過這些值再生成相同狀態的對象。這個過程也可以通過網絡實現,可以先在Windows機器上創建一個對象,對其序列化,然后通過網絡發給一臺Unix機器,然后在那里準確無誤地重新“裝配”。是不是很神奇。
  
  也許你會說,只了解一點點,但從來沒有接觸過,其實未必如此。RMI、Socket、JMS、EJB你總該用過一種吧,彼此為什么能夠傳遞java對象,當然都是對象序列化機制的功勞。
  
  第一次使用Java的對象序列化是做某項目,當時要求把幾棵非常復雜的樹(JTree)及相應的數據保存下來(就是我們常用的保存功能),以便下次運行程序時可以繼續上次的操作。
  
  那時xml技術在網上非常的熱,而且功能也強大,再加上樹的結構本來就和XML存儲數據的格式很像。作為一項對新技術比較有愛好的我當然很想嘗試一下。不過經過仔細分析,發現假如采用XML保存數據,后果真是難以想象:哪棵樹的哪個節點被展開、展開到第幾級、節點當前的屬性是什么。真是不知該用A、B、C還是用1、2、3來表示。
  
  還好,發現了Java的對象序列化機制,問題迎刃而解,只需簡單的將每棵樹的根節點序列化保存到硬盤上,下次再通過反序列化后的根節點就可以輕松的構造出和原來一模一樣的樹來。
  
  其實保存數據,尤其是復雜數據的保存正是對象序列化的典型應用。最近另一個項目就碰到了需要對非常復雜的數據進行存取,通過使用對象的序列化,問題同樣化難為簡。
  
  對象的序列化還有另一個輕易被大家忽略的功能就是對象復制(Clone),Java中通過Clone機制可以復制大部分的對象,但是眾所周知,Clone有深層Clone和淺層Clone,假如你的對象非常非常復雜,假設有個100層的Collection(夸張了點),假如你想實現深層Clone,真是不敢想象,假如使用序列化,不會超過10行代碼就可以解決。
  
  還有就是Swing組件,假如你有兩個很象很象(或是一模一樣)的比較難以構造的Swing組件,你該怎么辦,也許你想到了Clone,但是偏偏Java的Swing組件沒有提供Clone方法。別急,使用序列化,6行代碼搞定:
  
  ByteArrayOutputStream
  byteOut = new ByteArrayOutputStream();
  ObjectOutputStream out
  = new ObjectOutputStream(byteOut);
  out.writeObject(combo);
  
  ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
  ObjectInputStream in
  =new ObjectInputStream(byteIn);
  JComboBox comb2 = (JComboBox)in.readObject();
  
  雖然Java的序列化非常簡單、強大,但是要用好,還有很多地方需要注重。比如曾經序列化了一個對象,可由于某種原因,該類做了一點點改動,然后重新被編譯,那么這時反序列化剛才的對象,將會出現異常。
  
  你可以通過添加serialVersionUID屬性來解決這個問題。假如你的類是個單態(Singleton)類,是否答應用戶通過序列化機制復制該類,假如不答應你需要謹慎對待該類的實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 砀山县| 临汾市| 鹤庆县| 福泉市| 宁陕县| 龙海市| 铜山县| 兰西县| 临高县| 杨浦区| 潍坊市| 大余县| 海南省| 青海省| 曲水县| 拜泉县| 乳源| 方城县| 阿尔山市| 游戏| 荆门市| 双辽市| 梁平县| 怀来县| 通许县| 彭水| 崇文区| 临江市| 大城县| 西盟| 延寿县| 玉田县| 博湖县| 开阳县| 咸宁市| 左云县| 元氏县| 肃南| 山阳县| 正安县| 石首市|