溫馨提示×

溫馨提示×

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

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

Java序列化與反序列化怎么應(yīng)用

發(fā)布時間:2023-04-04 11:38:47 來源:億速云 閱讀:177 作者:iii 欄目:開發(fā)技術(shù)

這篇“Java序列化與反序列化怎么應(yīng)用”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java序列化與反序列化怎么應(yīng)用”文章吧。

    Java 序列化與反序列化

    Java序列化把一個對象Java Object變?yōu)橐粋€二進(jìn)制字節(jié)序列byte[]

    Java反序列化就是把一個二進(jìn)制字節(jié)序列byte[] 變?yōu)镴ava對象Java Object

    序列化API

    ObjectOutputStream

    字節(jié)輸出流對象,將對象的輸出流寫到文件中(結(jié)合FileOutputStream使用)

    實(shí)例:

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
    或
    FileOutputStream fout = new FileOutputStream("1.txt");
    ObjectOutputStream out = new ObjectOutputStream(fout);

    此外ObjectOutputStream還提供了writeObject()方法來序列化一個對象,并將它發(fā)送到輸出流。

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
    out.writeObject(new Test("Sentiment",10));        //對Test類中的構(gòu)造方法進(jìn)行傳參

    ObjectInputStream

    字節(jié)輸入流對象,將文件中的二進(jìn)制字節(jié)序列進(jìn)行反序列化操作(結(jié)合FileInputStream)

    實(shí)例:

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));
    或
    FileInputStream fin = new FileInputStream("1.txt");
    ObjectInputStream oin = new ObjectInputStream(fin);

    此外ObjectInputStream還提供readObject()方法從流中取出下一個對象,并將對象反序列化。它的返回值為Object,因此,需要將它轉(zhuǎn)換成合適的數(shù)據(jù)類型。

    ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
    Test o = (Test)In.readObject();
    System.out.println(o);        //讀取后輸出實(shí)例理解

    實(shí)例理解

    Test.java(類想要進(jìn)行序列化操作,必須實(shí)現(xiàn)Serializable接口繼承)

    package Sentiment.unserialize.demo01;
    
    import java.io.Serializable;
    
    public class Test implements Serializable {
        private String name;
        private int age;
    
        public Test() {
        }
    
        public Test(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
        }
    
    }

    Serializable.java

    package Sentiment.unserialize.demo01;
    
    import java.io.*;
    
    public class Serializable {
        public static void main(String[] args) throws IOException {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
            out.writeObject(new Test("Sentiment",10));
            out.close();
        }
    }

     UnSerializable.java

    package Sentiment.unserialize.demo01;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    
    public class UnSerializable {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
            Test o = (Test)In.readObject();
            System.out.println(o);
        }
    }

    運(yùn)行Serializable.java后便得到二進(jìn)制字節(jié)碼文件內(nèi)容

    Java序列化與反序列化怎么應(yīng)用

    此時在運(yùn)行UnSerializable.java便得到了二進(jìn)制字節(jié)碼反序列化后的內(nèi)容

    Java序列化與反序列化怎么應(yīng)用

    serialVersionUID

    • 每個可序列化的類在序列化時都會關(guān)聯(lián)一個版本號 , 這個版本號就是 serialVersionUID 屬性

    • serialVersionUID 屬性必須通過 static final long 修飾符來修飾 。

    • 如果可序列化的類未聲明 serialVersionUID 屬性 , 則 Java 序列化時會根據(jù)類的各種信息來計(jì)算默認(rèn)的 serialVersionUID 值 . 但是 Oracle 官方文檔強(qiáng)烈建議所有可序列化的類都顯示聲明 serialVersionUID 值 .

    實(shí)例理解

    在Test.java中定義serialVersionUID 其值為1

    package Sentiment.unserialize.demo01;
    
    import java.io.Serializable;
    
    public class Test implements Serializable {
        public static final long serialVersionUID = 1L;   //定義serialVersionUID 
    
        private  String name;
        private  int age;
    
        public Test() {
        }
    
        public Test(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
        }
    
    }

    此時運(yùn)行Serializable.java進(jìn)行序列化操作

    運(yùn)行完畢后將serialVersionUID的值定義為2—>public static final long serialVersionUID = 2L;,在運(yùn)行UnSerializable.java會報(bào)錯

    Java序列化與反序列化怎么應(yīng)用

    Transient (瞬態(tài)變量)

    Transient( 瞬態(tài)變量 )是一個 Java 關(guān)鍵詞 , 它用于標(biāo)記類的成員變量在持久化到字節(jié)流時不要被序列化 ; 在通過網(wǎng)絡(luò)套接字流傳輸字節(jié)流時 , transient 關(guān)鍵詞標(biāo)記的成員變量不會被序列化 。此為被static修飾的靜態(tài)變量也不參與序列化操作。

    實(shí)例理解

    將Test.java中的nameage變量前分別加上transientstatic

    package Sentiment.unserialize.demo01;
    
    import java.io.Serializable;
    
    public class Test implements Serializable {
        public static final long serialVersionUID = 1L;  //定義serialVersionUID 
        private transient String name;                     //加上transient
        private static int age;                             //加上static
    
        public Test() {
        }
    
        public Test(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
        }
    
    }

    此時在執(zhí)行Serializable.java和UnSerializable.java,輸出結(jié)果:Sentiment—>null,10—>0

    Java序列化與反序列化怎么應(yīng)用

    readObject()方法重寫

    官方允許用戶在被序列化的類中重寫 readObject() 方法 , 重寫后的方法將負(fù)責(zé)在反序列化時重構(gòu)當(dāng)前類對象 . 用戶只需要在重寫的 readObject() 方法中實(shí)現(xiàn) defaultReadObject() 方法 , 就可以確保反序列化過程正常執(zhí)行 .

    實(shí)例理解

    實(shí)現(xiàn) defaultReadObject() 方法調(diào)用,并在Test類中重寫該方法,在進(jìn)行序列化和反序列化操作即可執(zhí)行命令

    private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{
        a.defaultReadObject();
        Runtime.getRuntime().exec("calc.exe");
    }

    Java序列化與反序列化怎么應(yīng)用

    以上就是關(guān)于“Java序列化與反序列化怎么應(yīng)用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

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

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI