什么是java序列化,如何實現(xiàn)? 序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化??梢詫α骰蟮膶ο筮M行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡之間。 序列化是為了解決在對 對象進行讀寫操作時所引發(fā)的問題。 序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要被實現(xiàn)的方法,implement Serializable只是為了標注該對象是可被序列化的,然后使用 一個輸出流(如:fileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject方法就可以 將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復的話則利用輸入流。 SerialVersionUID--下面簡稱SUID 其實序列化的作用是能轉(zhuǎn)化成Byte流,然后又能反序列化成原始的類。能在網(wǎng)絡進行傳輸,也可以保存在磁盤中,有了SUID之后,那么如果序列化的類已經(jīng)保存了在本地中,中途你更改了類后,SUID變了,那么反序列化的時候就不會變成原始的類了,還會拋異常,主要就是用于版本控制。 SUID:IDE一般會幫你自動生成,其實這個值你可以自己設定,只要保證id值唯一就好。你可以理解成唯一標識。 serialVersionUID是用于記錄class文件的版本信息的,serialVersionUID這個數(shù)字是通過一個類的類名、成員、包名、工程名算出來的。 使用ObjectInputStream 反序列化的時候,ObjectInputStream會先讀取文件中的serialVersionUID,然后與本地的class文件的serialVersionUID進行對比,如果這兩個id不一致,那么反序列化就失敗了。 對象的輸入輸出流,主要的作用是用于寫對象與讀取對象的信息。對信息一旦寫到文件上那么對象的信息就可以持久化了
package com.io.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.*; import java.util.*;public class Test implements Serializable {//Serializable接口沒有任何方法,只是一個標識接口 public static void main(String[] args) throws Exception { new Test().test(); } private void test() throws FileNotFoundException, IOException, ClassNotFoundException { Mapmap = new HashMap (); map.put(1, new Film("變形金剛", 20)); map.put(2, new Film("鋼鐵俠", 30)); map.put(3, new Film("復仇者聯(lián)盟", 40)); /*,序列化其實就是將film的相關(guān)信息轉(zhuǎn)化為二進制存儲在了map.txt這個文件中,那么用文本編輯器打開查看的話當然是會出現(xiàn)亂碼的。只有通過反序列化才能將存儲的二進制讀取出來,然后正常顯示在控制臺上。*/ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("map.txt")); oos.writeObject(map); oos.close(); /*反序列化*/ ObjectInputStream ois = new ObjectInputStream(new FileInputStream("map.txt")); Map m = new HashMap (); m = (Map ) ois.readObject(); ois.close(); System.out.println(m.toString()); } class Film implements Serializable { //先執(zhí)行序列化方法 唯一標識是1L 然后改成2L后 反序列化輸出會報錯 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 + '}'; } } }
站在用戶的角度思考問題,與客戶深入溝通,找到薩嘎網(wǎng)站設計與薩嘎網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋薩嘎地區(qū)。
對象輸入輸出流要注意的細節(jié)
http://shenzhen.offcn.com/