簡單來說,如果你只是自己同一臺機器的同一個環(huán)境下使用同一個JVM來操作,序列化和反序列化是沒必要的,當(dāng)需要進行數(shù)據(jù)傳輸?shù)臅r候就顯得十分必要。比如你的數(shù)據(jù)寫到文件里要被其他人的電腦的程序使用,或者你電腦上的數(shù)據(jù)需要通過網(wǎng)絡(luò)傳輸給其他人的程序使用,像服務(wù)器客戶端的這種模型就是一種應(yīng)用,這個時候,大家想想,每個人的電腦配置可能不同,運行環(huán)境可能也不同,字節(jié)序可能也不同,總之很多地方都不能保證一致,所以為了統(tǒng)一起見,我們傳輸?shù)臄?shù)據(jù)或者經(jīng)過文件保存的數(shù)據(jù)需要經(jīng)過序列化和編碼等操作,相當(dāng)于交互雙方有一個公共的標(biāo)準(zhǔn),按照這種標(biāo)準(zhǔn)來做,不管各自的環(huán)境是否有差異,各自都可以根據(jù)這種標(biāo)準(zhǔn)來翻譯出自己能理解的正確的數(shù)據(jù)。
十載的萊西網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整萊西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“萊西網(wǎng)站設(shè)計”,“萊西網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
除了在持久化對象時會用到對象序列化之外,當(dāng)使用RMI(遠程方法調(diào)用),或在網(wǎng)絡(luò)中傳遞對象時,都會用到對象序列化。實現(xiàn)序列化:
1 ? 首先要把準(zhǔn)備要序列化類,實現(xiàn) Serializabel接口
import?java.io.Serializable;?
public?class?Person?implements?Serializable?{
//本類可以序列化
private?String?name?;?
private?int?age?;
public?Person(String?name,int?age)
{?
this.name?=?name?;?this.age?=?age?;
}?
public?String?toString()
{
return?"姓名:"?+?this.name?+?",年齡"?+?this.age?;
}?
}
2 序列化
package?org.lxh.SerDemo;?
import?java.io.File;
import?java.io.FileOutputStream;?
import?java.io.ObjectOutputStream?;
public?class?ObjectOutputStreamDemo
{
//序列化?
public?static?void?main(String[]?args)?throws?Exception?
{
//序列化后生成指定文件路徑?
File?file?=?new?File("D:"?+?File.separator?+?"person.ser")?;
ObjectOutputStream?oos?=?null?;
//裝飾流(流)
oos?=?new?ObjectOutputStream(new?FileOutputStream(file))?;?
//實例化類?
Person?per?=?new?Person("張三",30)?;
oos.writeObject(per)?;
//把類對象序列化
oos.close()?;
}?
}
需要注意的是:
靜態(tài)成員是不能被序列化的,因為靜態(tài)成員是隨著類的加載而加載的,與類共存亡,并且靜態(tài)成員的默認初始值都是0;就是說靜態(tài)成員屬于類級別的,所以不能序列化,序列化只是序列化了對象而已。
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化??梢詫α骰蟮膶ο筮M行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。
序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。
序列化可以將這個類的實例寫入流中,而沒有序列化的是不可以直接寫入流中的 ;如String這個類就是序列化的了,你可以io.write("sdfsdf");如果沒有的話就不可以