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