什么是java序列化,如何实现java序列化?
Java 串行化技術(shù)可以使你將一個(gè)對(duì)象的狀態(tài)寫入一個(gè)Byte流里,并且可以從其它地方把該Byte 流里的數(shù)據(jù)讀出來(lái),重新構(gòu)造一個(gè)相同的對(duì)象。這種機(jī)制允許你將對(duì)象通過(guò)網(wǎng)絡(luò)進(jìn)行傳播,并可以隨時(shí)把對(duì)象持久化到數(shù)據(jù)庫(kù)、文件等系統(tǒng)里。Java的串行化機(jī)制是RMI、EJB等技術(shù)的技術(shù)基礎(chǔ)。用途:利用對(duì)象的串行化實(shí)現(xiàn)保存應(yīng)用程序的當(dāng)前工作狀態(tài),下次再啟動(dòng)的時(shí)候?qū)⒆詣?dòng)地恢復(fù)到上次執(zhí)行的狀態(tài)。
序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化。可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問(wèn)題。
序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。
2、串行化的特點(diǎn):
??? (1)如果某個(gè)類能夠被串行化,其子類也可以被串行化。如果該類有父類,則分兩種情況來(lái)考慮,如果該父類已經(jīng)實(shí)現(xiàn)了可串行化接口。則其父類的相應(yīng)字段及屬性的處理和該類相同;如果該類的父類沒(méi)有實(shí)現(xiàn)可串行化接口,則該類的父類所有的字段屬性將不會(huì)串行化。
? (2)聲明為static和transient類型的成員數(shù)據(jù)不能被串行化。因?yàn)閟tatic代表類的狀態(tài),transient代表對(duì)象的臨時(shí)數(shù)據(jù);
? (3)相關(guān)的類和接口:在java.io包中提供的涉及對(duì)象的串行化的類與接口有ObjectOutput接口、ObjectOutputStream類、ObjectInput接口、ObjectInputStream類。
? ??(1)ObjectOutput接口:它繼承DataOutput接口并且支持對(duì)象的串行化,其內(nèi)的writeObject()方法實(shí)現(xiàn)存儲(chǔ)一個(gè)對(duì)象。ObjectInput接口:它繼承DataInput接口并且支持對(duì)象的串行化,其內(nèi)的readObject()方法實(shí)現(xiàn)讀取一個(gè)對(duì)象。
??? (2)ObjectOutputStream類:它繼承OutputStream類并且實(shí)現(xiàn)ObjectOutput接口。利用該類來(lái)實(shí)現(xiàn)將對(duì)象存儲(chǔ)(調(diào)用ObjectOutput接口中的writeObject()方法)。ObjectInputStream類:它繼承InputStream類并且實(shí)現(xiàn)ObjectInput接口。利用該類來(lái)實(shí)現(xiàn)讀取一個(gè)對(duì)象(調(diào)用ObjectInput接口中的readObject()方法)。
? 對(duì)于父類的處理,如果父類沒(méi)有實(shí)現(xiàn)串行化接口,則其必須有默認(rèn)的構(gòu)造函數(shù)(即沒(méi)有參數(shù)的構(gòu)造函數(shù))。否則編譯的時(shí)候就會(huì)報(bào)錯(cuò)。在反串行化的時(shí)候,默認(rèn)構(gòu)造函數(shù)會(huì)被調(diào)用。但是若把父類標(biāo)記為可以串行化,則在反串行化的時(shí)候,其默認(rèn)構(gòu)造函數(shù)不會(huì)被調(diào)用。這是為什么呢?這是因?yàn)镴ava 對(duì)串行化的對(duì)象進(jìn)行反串行化的時(shí)候,直接從流里獲取其對(duì)象數(shù)據(jù)來(lái)生成一個(gè)對(duì)象實(shí)例,而不是通過(guò)其構(gòu)造函數(shù)來(lái)完成。
import java.io.*;public class Cat implements Serializable {private String name;public Cat () {this.name = "new cat";}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public static void main(String[] args) { Cat cat = new Cat();try {FileOutputStream fos = new FileOutputStream("catDemo.out");ObjectOutputStream oos = new ObjectOutputStream(fos);System.out.println(" 1> " + cat.getName());cat.setName("My Cat"); oos.writeObject(cat);oos.close(); } catch (Exception ex) { ex.printStackTrace(); }try { FileInputStream fis = new FileInputStream("catDemo.out");ObjectInputStream ois = new ObjectInputStream(fis);cat = (Cat) ois.readObject();System.out.println(" 2> " + cat.getName());ois.close();} catch (Exception ex) {ex.printStackTrace();}}}//writeObject和readObject本身就是線程安全的,傳輸過(guò)程中是不允許被并發(fā)訪問(wèn)的。所以對(duì)象能一個(gè)一個(gè)接連不斷的傳過(guò)來(lái)超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生
總結(jié)
以上是生活随笔為你收集整理的什么是java序列化,如何实现java序列化?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java的int、char、long、f
- 下一篇: java序列化Serializable