序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化。
可以對(duì)流化后的對(duì)象進(jìn)行讀寫(xiě)操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決對(duì)象流讀寫(xiě)操作時(shí)可能引發(fā)的問(wèn)題(如果不進(jìn)行序列化可能會(huì)存在數(shù)據(jù)亂序的問(wèn)題)。 (推薦學(xué)習(xí):java課程)
要實(shí)現(xiàn)序列化,需要讓一個(gè)類(lèi)實(shí)現(xiàn)Serializable接口,該接口是一個(gè)標(biāo)識(shí)性接口,標(biāo)注該類(lèi)對(duì)象是可被序列化的,然后使用一個(gè)輸出流來(lái)構(gòu)造一個(gè)對(duì)象輸出流并通過(guò)writeObject(Object obj)方法就可以將實(shí)現(xiàn)對(duì)象寫(xiě)出(即保存其狀態(tài));
如果需要反序列化則可以用一個(gè)輸入流建立對(duì)象輸入流,然后通過(guò)readObject方法從流中讀取對(duì)象。序列化除了能夠?qū)崿F(xiàn)對(duì)象的持久化之外,還能夠用于對(duì)象的深度克隆。
為了演示序列化在Java中是怎樣工作的,我將使用之前教程中提到的Employee類(lèi),假設(shè)我們定義了如下的Employee類(lèi),該類(lèi)實(shí)現(xiàn)了Serializable 接口。
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } }
請(qǐng)注意,一個(gè)類(lèi)的對(duì)象要想序列化成功,必須滿(mǎn)足兩個(gè)條件:
該類(lèi)必須實(shí)現(xiàn) java.io.Serializable 接口。
該類(lèi)的所有屬性必須是可序列化的。如果有一個(gè)屬性不是可序列化的,則該屬性必須注明是短暫的。
如果你想知道一個(gè) Java 標(biāo)準(zhǔn)類(lèi)是否是可序列化的,請(qǐng)查看該類(lèi)的文檔。檢驗(yàn)一個(gè)類(lèi)的實(shí)例是否能序列化十分簡(jiǎn)單, 只需要查看該類(lèi)有沒(méi)有實(shí)現(xiàn) java.io.Serializable接口。