主要類與方法和描述
1. ObjectOutputStream.writeObject() //將一個對象序列化到外部字節(jié)流
2. ObjectInputStream.readObject() //從外部字節(jié)流讀取并重新構(gòu)造對象
從實(shí)際應(yīng)用上看來,“Serializable”這個接口并沒有定義任何方法,仿佛它只是一個標(biāo)記(或者說像是Java的關(guān)鍵字)而已,一旦虛擬機(jī)看到這個“標(biāo)記”,就會嘗試調(diào)用自身預(yù)定義的序列化機(jī)制,除非你在實(shí)現(xiàn)Serializable接口的同時還定義了私有的readObject()或writeObject()方法。這一點(diǎn)很奇怪。不過你要是不愿意讓系統(tǒng)使用缺省的方式進(jìn)行序列化,那就必須定義上面提到的兩個方法:
1. public class MySerial implements java.io.Serializable
2. {
3. private void writeObject(java.io.ObjectOutputStream out) throws IOException
4. {
5. //...
6. }
7. private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
8. {
9. //...
10. }
11. //...
12. }
譬如你可以在上面的writeObject()里調(diào)用默認(rèn)的序列化方法ObjectOutputStream.defaultWriteObject();譬如你不愿意將某些敏感的屬性和信息序列化,你也可以調(diào)用ObjectOutputStream.writeObject()方法明確指定需要序列化那些屬性。關(guān)于用戶可定制的序列化方法,我們將在后面提到。
★Bean
上面的序列化只是一種基本應(yīng)用,你把一個對象序列化到外部文件以后,用notepad打開那個文件,只能從為數(shù)不多的一些可讀字符中猜到這是有關(guān)這個類的信息文件,這需要你熟悉序列化文件的字節(jié)編碼方式,那將是比較痛苦的(在《Core Java 2》第一卷里提到了相關(guān)編碼方式,有興趣的話可以查看參考資料),某些情況下我們可能需要被序列化的文件具有更好的可讀性。另一方面,作為Java組件的核心概念“JavaBeans”,從JDK 1.4開始,其規(guī)范里也要求支持文本方式的“長期的持久化”(long-term persistence)。
打開JDK文檔,java.beans包里的有一個名為“Encoder”的類,這就是一個可以序列化bean的實(shí)用類。和它相關(guān)的兩個主要類有XMLEcoder和XMLDecoder,顯然,這是以XML文件的格式保存和讀取bean的工具。他們的用法也很簡單,和上面ObjectOutputStream/ObjectInputStream比較類似。
主要類與方法和描述
1. XMLEncoder.writeObject() //將一個對象序列化到外部字節(jié)流
2. XMLDecoder.readObject() //從外部字節(jié)流讀取并重新構(gòu)造對象
如果一個bean是如下格式:
1. public class MyBean
2. {
3. int i;
4. char[] c;
5. String s;
6. //...(get和set操作省略)...
7. }
那么通過XMLEcoder序列化出來的XML文件具有這樣的形式:
1
a
b
c
fox jump!
像AWT和Swing中很多可視化組件都是bean,當(dāng)然也是可以用這種方式序列化的,下面就是從JDK文檔中摘錄的一個JFrame序列化以后的XML文件:
frame1
0
0
200
200
Hello
true
因此但你想要保存的數(shù)據(jù)是一些不是太復(fù)雜的類型的話,把它做成bean再序列化也不失為一種方便的選擇。
相關(guān)推薦:計(jì)算機(jī)等級考試二級Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |