序列化就是一種用來處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問題。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供順平企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為順平眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口,該接口沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。
簡單來說,如果你只是自己同一臺(tái)機(jī)器的同一個(gè)環(huán)境下使用同一個(gè)JVM來操作,序列化和反序列化是沒必要的,當(dāng)需要進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候就顯得十分必要。比如你的數(shù)據(jù)寫到文件里要被其他人的電腦的程序使用,或者你電腦上的數(shù)據(jù)需要通過網(wǎng)絡(luò)傳輸給其他人的程序使用,像服務(wù)器客戶端的這種模型就是一種應(yīng)用,這個(gè)時(shí)候,大家想想,每個(gè)人的電腦配置可能不同,運(yùn)行環(huán)境可能也不同,字節(jié)序可能也不同,總之很多地方都不能保證一致,所以為了統(tǒng)一起見,我們傳輸?shù)臄?shù)據(jù)或者經(jīng)過文件保存的數(shù)據(jù)需要經(jīng)過序列化和編碼等操作,相當(dāng)于交互雙方有一個(gè)公共的標(biāo)準(zhǔn),按照這種標(biāo)準(zhǔn)來做,不管各自的環(huán)境是否有差異,各自都可以根據(jù)這種標(biāo)準(zhǔn)來翻譯出自己能理解的正確的數(shù)據(jù)。
除了在持久化對(duì)象時(shí)會(huì)用到對(duì)象序列化之外,當(dāng)使用RMI(遠(yuǎn)程方法調(diào)用),或在網(wǎng)絡(luò)中傳遞對(duì)象時(shí),都會(huì)用到對(duì)象序列化。實(shí)現(xiàn)序列化:
1 ? 首先要把準(zhǔn)備要序列化類,實(shí)現(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))?;?
//實(shí)例化類?
Person?per?=?new?Person("張三",30)?;
oos.writeObject(per)?;
//把類對(duì)象序列化
oos.close()?;
}?
}
需要注意的是:
靜態(tài)成員是不能被序列化的,因?yàn)殪o態(tài)成員是隨著類的加載而加載的,與類共存亡,并且靜態(tài)成員的默認(rèn)初始值都是0;就是說靜態(tài)成員屬于類級(jí)別的,所以不能序列化,序列化只是序列化了對(duì)象而已。
java 中實(shí)現(xiàn)序列化,只要實(shí)現(xiàn)Serializbale這個(gè)接口,那么這個(gè)類就能序列化了。
序列化就是把對(duì)象轉(zhuǎn)化為二進(jìn)制編碼,有兩個(gè)作用1.用于網(wǎng)絡(luò)傳輸。2.可以存儲(chǔ)到硬盤中,用來保存。類對(duì)象都是在內(nèi)存中的,當(dāng)系統(tǒng)關(guān)閉后對(duì)象就沒了,下次啟動(dòng)時(shí)重新生成對(duì)象,不能保存當(dāng)時(shí)狀態(tài)。
有序列化,就有反序列化,反序列化就是恢復(fù)當(dāng)時(shí)狀態(tài)的類對(duì)象。
一、什么是序列化:\x0d\x0a序列化理解成“打碎”是可以的,不過在書本上的名詞就是將對(duì)象轉(zhuǎn)換成二進(jìn)制。\x0d\x0a\x0d\x0a二、在java中如何實(shí)現(xiàn)序列化:\x0d\x0a首先我們要把準(zhǔn)備要序列化類,實(shí)現(xiàn) Serializabel接口\x0d\x0a例如:我們要Person類里的name和age都序列化\x0d\x0aimport java.io.Serializable;\x0d\x0a\x0d\x0apublic class Person implements Serializable { //本類可以序列化\x0d\x0a private String name ;\x0d\x0a private int age ;\x0d\x0a \x0d\x0a public Person(String name,int age){\x0d\x0a this.name = name ;\x0d\x0a this.age = age ;\x0d\x0a }\x0d\x0a public String toString(){\x0d\x0a return "姓名:" + this.name + ",年齡" + this.age ;\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a然后:我們將name和age序列化(也就是把這2個(gè)對(duì)象轉(zhuǎn)為二進(jìn)制,統(tǒng)族理解為“打碎”)\x0d\x0apackage org.lxh.SerDemo;\x0d\x0a\x0d\x0aimport java.io.File;\x0d\x0aimport java.io.FileOutputStream;\x0d\x0aimport java.io.ObjectOutputStream ;\x0d\x0a\x0d\x0apublic class ObjectOutputStreamDemo { //序列化\x0d\x0a\x0d\x0a public static void main(String[] args) throws Exception {\x0d\x0a//序列化后生成指定文件路徑\x0d\x0a File file = new File("D:" + File.separator + "person.ser") ; ObjectOutputStream oos = null ;\x0d\x0a//裝飾流(流)\x0d\x0a oos = new ObjectOutputStream(new FileOutputStream(file)) ; \x0d\x0a//實(shí)例化類\x0d\x0a Person per = new Person("張三",30) ; oos.writeObject(per) ;//把類對(duì)象序列化\x0d\x0a oos.close() ;\x0d\x0a }\x0d\x0a}