您好,登錄后才能下訂單哦!
什么是java序列化,如何實(shí)現(xiàn)? 序列化就是一種用來(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接口,該接口沒(méi)有需要被實(shí)現(xiàn)的方法,implement Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用 一個(gè)輸出流(如:fileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject方法就可以 將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則利用輸入流。 SerialVersionUID--下面簡(jiǎn)稱SUID 其實(shí)序列化的作用是能轉(zhuǎn)化成Byte流,然后又能反序列化成原始的類。能在網(wǎng)絡(luò)進(jìn)行傳輸,也可以保存在磁盤中,有了SUID之后,那么如果序列化的類已經(jīng)保存了在本地中,中途你更改了類后,SUID變了,那么反序列化的時(shí)候就不會(huì)變成原始的類了,還會(huì)拋異常,主要就是用于版本控制。 SUID:IDE一般會(huì)幫你自動(dòng)生成,其實(shí)這個(gè)值你可以自己設(shè)定,只要保證id值唯一就好。你可以理解成唯一標(biāo)識(shí)。 serialVersionUID是用于記錄class文件的版本信息的,serialVersionUID這個(gè)數(shù)字是通過(guò)一個(gè)類的類名、成員、包名、工程名算出來(lái)的。 使用ObjectInputStream 反序列化的時(shí)候,ObjectInputStream會(huì)先讀取文件中的serialVersionUID,然后與本地的class文件的serialVersionUID進(jìn)行對(duì)比,如果這兩個(gè)id不一致,那么反序列化就失敗了。 對(duì)象的輸入輸出流,主要的作用是用于寫對(duì)象與讀取對(duì)象的信息。對(duì)信息一旦寫到文件上那么對(duì)象的信息就可以持久化了
package com.io.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.*; import java.util.*;public class Test implements Serializable {//Serializable接口沒(méi)有任何方法,只是一個(gè)標(biāo)識(shí)接口 public static void main(String[] args) throws Exception { new Test().test(); } private void test() throws FileNotFoundException, IOException, ClassNotFoundException { Map<Integer, Film> map = new HashMap<Integer, Film>(); map.put(1, new Film("變形金剛", 20)); map.put(2, new Film("鋼鐵俠", 30)); map.put(3, new Film("復(fù)仇者聯(lián)盟", 40)); /*,序列化其實(shí)就是將film的相關(guān)信息轉(zhuǎn)化為二進(jìn)制存儲(chǔ)在了map.txt這個(gè)文件中,那么用文本編輯器打開查看的話當(dāng)然是會(huì)出現(xiàn)亂碼的。只有通過(guò)反序列化才能將存儲(chǔ)的二進(jìn)制讀取出來(lái),然后正常顯示在控制臺(tái)上。*/ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("map.txt")); oos.writeObject(map); oos.close(); /*反序列化*/ ObjectInputStream ois = new ObjectInputStream(new FileInputStream("map.txt")); Map<Integer, Film> m = new HashMap<Integer, Film>(); m = (Map<Integer, Film>) ois.readObject(); ois.close(); System.out.println(m.toString()); } class Film implements Serializable { //先執(zhí)行序列化方法 唯一標(biāo)識(shí)是1L 然后改成2L后 反序列化輸出會(huì)報(bào)錯(cuò) private static final long serialVersionUID = 1L; private String name; private int duration; public Film(String name, int duration) { this.name = name; this.duration = duration; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDuration() { return duration; } public void setDuration(int duration) { this.duration = duration; } public Film() { } @Override public String toString() { return "Film{" + "name='" + name + '\'' + ", duration=" + duration + '}'; } } }
對(duì)象輸入輸出流要注意的細(xì)節(jié)
http://shenzhen.offcn.com/
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。