最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java序列化與反序列化

 更新時(shí)間:2023年04月03日 09:35:11   作者:Sentiment.  
這篇文章主要介紹了Java的序列化與反序列化,序列化把一個(gè)對(duì)象Java Object變?yōu)橐粋€(gè)二進(jìn)制字節(jié)序列byte[];反序列化就是把一個(gè)二進(jìn)制字節(jié)序列byte[]變?yōu)镴ava對(duì)象Java Object。感興趣的小伙伴可以參考閱讀

Java 序列化與反序列化

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

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

序列化API

ObjectOutputStream

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

實(shí)例:

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

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

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

ObjectInputStream

字節(jié)輸入流對(duì)象,將文件中的二進(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()方法從流中取出下一個(gè)對(duì)象,并將對(duì)象反序列化。它的返回值為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)容

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

serialVersionUID

  • 每個(gè)可序列化的類在序列化時(shí)都會(huì)關(guān)聯(lián)一個(gè)版本號(hào) , 這個(gè)版本號(hào)就是 serialVersionUID 屬性
  • serialVersionUID 屬性必須通過 static final long 修飾符來修飾 。
  • 如果可序列化的類未聲明 serialVersionUID 屬性 , 則 Java 序列化時(shí)會(huì)根據(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 + '}';
    }

}

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

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

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

Transient( 瞬態(tài)變量 )是一個(gè) Java 關(guān)鍵詞 , 它用于標(biāo)記類的成員變量在持久化到字節(jié)流時(shí)不要被序列化 ; 在通過網(wǎng)絡(luò)套接字流傳輸字節(jié)流時(shí) , transient 關(guān)鍵詞標(biāo)記的成員變量不會(huì)被序列化 。此為被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 + '}';
    }

}

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

readObject()方法重寫

? 官方允許用戶在被序列化的類中重寫 readObject() 方法 , 重寫后的方法將負(fù)責(zé)在反序列化時(shí)重構(gòu)當(dāng)前類對(duì)象 . 用戶只需要在重寫的 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");
}

總結(jié)

  • 類想要進(jìn)行序列化操作,必須實(shí)現(xiàn)Serializable接口繼承
  • 強(qiáng)烈建議定義serialVersionUID ,序列化、反序列化前后不要修改其值
  • 被static、Transient修飾的屬性,不會(huì)進(jìn)行序列化操作
  • readObject()方法重寫時(shí),需要實(shí)現(xiàn)defaultReadObject() 方法

 以上就是Java序列化與反序列化的詳細(xì)內(nèi)容,更多關(guān)于Java序列化與反序列化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    這篇文章主要為大家介紹了從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens刷新令牌示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java獲取精確到秒的時(shí)間戳方法

    Java獲取精確到秒的時(shí)間戳方法

    這篇文章主要為大家詳細(xì)介紹了Java獲取精確到秒的時(shí)間戳方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • mybatis-plus批處理IService的實(shí)現(xiàn)示例

    mybatis-plus批處理IService的實(shí)現(xiàn)示例

    這篇文章主要介紹了mybatis-plus批處理IService的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 聊聊Spring Boot 如何集成多個(gè) Kafka

    聊聊Spring Boot 如何集成多個(gè) Kafka

    這篇文章主要介紹了Spring Boot 集成多個(gè) Kafka的相關(guān)資料,包括配置文件,生成者和消費(fèi)者配置過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • 1秒鐘實(shí)現(xiàn)Springboot?替換/寫入?word文檔里面的文字、圖片功能

    1秒鐘實(shí)現(xiàn)Springboot?替換/寫入?word文檔里面的文字、圖片功能

    這篇文章主要介紹了Springboot?替換/寫入?word文檔里面的文字、圖片,1秒鐘實(shí)現(xiàn),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 通過Java實(shí)現(xiàn)帶干擾線的驗(yàn)證碼

    通過Java實(shí)現(xiàn)帶干擾線的驗(yàn)證碼

    帶干擾線的驗(yàn)證碼是一種常見的安全驗(yàn)證方式,目的是通過圖像中的干擾線增加機(jī)器識(shí)別的難度,確保只有人類用戶能夠順利識(shí)別并輸入驗(yàn)證碼,本項(xiàng)目的目的是通過Java實(shí)現(xiàn)一個(gè)帶有干擾線的驗(yàn)證碼生成器,需要的朋友可以參考下
    2025-02-02
  • IDEA中的Run/Debug Configurations各項(xiàng)解讀

    IDEA中的Run/Debug Configurations各項(xiàng)解讀

    這篇文章主要介紹了IDEA中的Run/Debug Configurations各項(xiàng)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringCloud Gateway的熔斷限流配置實(shí)現(xiàn)方法

    SpringCloud Gateway的熔斷限流配置實(shí)現(xiàn)方法

    Spring Cloud Gateway支持通過配置熔斷和限流機(jī)制來保證服務(wù)的穩(wěn)定性和可用性,可通過Hystrix和Resilience4j兩種方式實(shí)現(xiàn)。Hystrix通過注解和配置文件實(shí)現(xiàn)熔斷限流,Resilience4j通過編程式配置實(shí)現(xiàn)
    2023-04-04
  • 啟動(dòng)springboot項(xiàng)目時(shí)報(bào)錯(cuò):無法訪問org.springframework.web.bind.annotation.GetMapping …具有錯(cuò)誤的版本 61.0,應(yīng)為52.0?的解決方案

    啟動(dòng)springboot項(xiàng)目時(shí)報(bào)錯(cuò):無法訪問org.springframework.web.bind.annotatio

    這篇文章給大家分享了啟動(dòng)springboot項(xiàng)目時(shí)報(bào)錯(cuò):?無法訪問org.springframework.web.bind.annotation.GetMapping …具有錯(cuò)誤的版本 61.0,應(yīng)為52.0?的解決方案,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Maven resrouce下filtering的使用方法

    Maven resrouce下filtering的使用方法

    本文介紹了Maven的resource插件中的filtering功能,該功能用于在構(gòu)建過程中將資源目錄下的文件中的tokens進(jìn)行參數(shù)替換,tokens的來源可以是pom文件中的properties屬性或外部的.properties文件,通過這種方式,可以靈活地切換不同開發(fā)環(huán)境下的配置屬性
    2024-11-11

最新評(píng)論

朝阳市| 宾阳县| 古田县| 凤山市| 隆子县| 开江县| 思南县| 伊吾县| 平塘县| 昌邑市| 滦平县| 沾化县| 郸城县| 彭水| 寻乌县| 宜兴市| 白朗县| 丰县| 县级市| 甘肃省| 塔河县| 通山县| 庐江县| 乐昌市| 临泽县| 嫩江县| 卢龙县| 基隆市| 老河口市| 屏南县| 普格县| 麦盖提县| 申扎县| 东兴市| 宽城| 漳浦县| 汉阴县| 仪陇县| 萍乡市| 宣化县| 璧山县|