溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Serializable接口

發(fā)布時(shí)間:2020-08-11 12:37:30 來(lái)源:ITPUB博客 閱讀:167 作者:ii_chengzi 欄目:web開發(fā)
什么是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ì)象的信息就可以持久化了
Serializable接口
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 +                    '}';
        }
    }
}
Serializable接口

 

對(duì)象輸入輸出流要注意的細(xì)節(jié)

  1. 如果對(duì)象需要被寫到文件上,那么對(duì)象所屬的類必須實(shí)現(xiàn)Serializable接口,Serializable接口沒(méi)有任何方法,只是一個(gè)標(biāo)識(shí)接口。
  2. 對(duì)象的反序列化創(chuàng)建對(duì)象的時(shí)候并不會(huì)調(diào)用到構(gòu)造方法的。
  3. serialVersionUID是用于記錄class文件的版本信息的,serialVersionUID這個(gè)數(shù)字是通過(guò)一個(gè)類的類名、成員、包名、工程名算出來(lái)的。
  4. 使用ObjectInputStream 反序列化的時(shí)候,ObjectInputStream會(huì)先讀取文件中的serialVersionUID,然后與本地的class文件的serialVersionUID進(jìn)行對(duì)比,如果這兩個(gè)id不一致,那么反序列化就失敗了。
  5. 如果序列化與反序列化的時(shí)候可能會(huì)修改類的成員,那么最好一開始就給這個(gè)類指定一個(gè)serialVersionUID,如果一個(gè)類制定了serialVersionUID,然后再序列化和反序列化的時(shí)候,jvm都不會(huì)再自己算這個(gè)serialVersionUID
  6. 如果一個(gè)對(duì)象某個(gè)數(shù)據(jù)不想被序列化到硬盤上,可以使用關(guān)鍵字transient修飾
  7. 如果一個(gè)類維護(hù)了另外一個(gè)類的引用,那么另外一個(gè)類也需要實(shí)現(xiàn)Serializable接口
你們都是有經(jīng)驗(yàn)的開發(fā)人員

http://shenzhen.offcn.com/

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI