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

淺析關(guān)于java的序列化和反序列化

 更新時(shí)間:2023年07月26日 11:53:52   作者:yasooooo  
這篇文章主要介紹了淺析關(guān)于java的序列化和反序列化,所謂序列化,就是把要傳輸?shù)膶?duì)象以及相關(guān)信息轉(zhuǎn)換成字節(jié)數(shù)組進(jìn)行存儲(chǔ)的過程,而反序列化就是將字節(jié)數(shù)組再轉(zhuǎn)回對(duì)象的過程,需要的朋友可以參考下

對(duì)于序列化和反序列化,大家或多或少都會(huì)聽過一點(diǎn)。

所謂序列化,就是把要傳輸?shù)膶?duì)象以及相關(guān)信息轉(zhuǎn)換成字節(jié)數(shù)組進(jìn)行存儲(chǔ)的過程。

而反序列化就是將字節(jié)數(shù)組再轉(zhuǎn)回對(duì)象的過程。

對(duì)于序列化和反序列化總結(jié)了幾點(diǎn)需要注意的地方,

1、實(shí)現(xiàn)Serializable接口的類才能夠序列化,如果是父類實(shí)現(xiàn)了該接口,子類也可以進(jìn)行序列化

這點(diǎn)不過多解釋,規(guī)定就是這樣。

2、靜態(tài)成員不能被序列化、方法不能被序列化,關(guān)鍵字transient修飾的屬性不能序列化

話不多說,上代碼。

import java.io.*;
/**
 * 測試靜態(tài)成員、方法、transient修飾的屬性不能序列化
 */
public class SerializeTest {
    public static void main(String[] args) throws IOException {
        Test test = new Test(); // 創(chuàng)建被序列化的對(duì)象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.data"));
        oos.writeObject(test);
        oos.close(); //這里記得序列化完成之后要關(guān)流,和io流一樣,不多解釋
    }
}
class Test implements Serializable{ //創(chuàng)建一個(gè)類用于創(chuàng)建序列化對(duì)象
    static int a;
    transient private int b;
    private int c;
    public void m(){}
}

以上代碼就是創(chuàng)建了一個(gè)類,然后對(duì)該類的對(duì)象進(jìn)行序列化,序列化后的文件為test.data.然后查看了一個(gè)這個(gè)文件的大小為53字節(jié)。

下面我將這個(gè)類中的靜態(tài)成員、transient修飾的成員和m()方法都注釋掉再進(jìn)行一次序列化

import java.io.*;
/**
 * 測試靜態(tài)成員、方法、transient修飾的屬性不能序列化
 */
public class SerializeTest {
    public static void main(String[] args) throws IOException {
        Test test = new Test(); // 創(chuàng)建被序列化的對(duì)象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.data"));
        oos.writeObject(test);
        oos.close(); //這里記得序列化完成之后要關(guān)流,和io流一樣,不多解釋
    }
}
class Test implements Serializable{ // 將static屬性、transient屬性和方法都注釋掉之后在進(jìn)行一次序列化
//    static int a;
//    transient private int b;
    private int c;
//    public void m(){}
}

此時(shí),看到再序列化之后的文件大小依然還是53字節(jié),但是如果再將成員變量c注釋掉再進(jìn)行序列化就會(huì)發(fā)現(xiàn),這個(gè)文件變小了

由此可以說明,靜態(tài)成員、transient修飾的成員和方法都不能序列化。

3、對(duì)于向上造型的對(duì)象進(jìn)行序列化,實(shí)際序列化的對(duì)象是實(shí)際創(chuàng)建類

上代碼

 
import java.io.*;
/**
 * 測試向上造型的對(duì)象實(shí)際序列化的是實(shí)際創(chuàng)建類
 */
public class SerializeTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Test test = new Test02();
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test02.data"));
        oos.writeObject(test);
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test02.data"));
        System.out.println(ois.readObject()); //這里直接打印反序列化之后的對(duì)象信息
        ois.close();
    }
}
class Test implements Serializable{ //創(chuàng)建一個(gè)父類類用于創(chuàng)建序列化對(duì)象
}
class Test02 extends Test{    // 子類繼承父類
}

上面代碼的執(zhí)行結(jié)果:Test02@4f3f5b24,可以看到打印的就是子類的對(duì)象,so,這個(gè)就證明了向上造型的對(duì)象,實(shí)際序列化的是實(shí)際創(chuàng)建類,同時(shí)也證明了如果父類實(shí)現(xiàn)了Serializable接口,子類也是可以序列化滴。

4、對(duì)于已經(jīng)序列化完的對(duì)象,在進(jìn)行反序列化時(shí),如果對(duì)原類信息進(jìn)行了修改(包含不能被序列化的屬性和方法),此時(shí)將不能進(jìn)行反序列化

直接上代碼。

 
import java.io.*;
/**
 * 測試反序列化之前如果修改原類信息將不能進(jìn)行反序列化
 * 
 */
public class SerializeTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test02.data"));
        System.out.println(ois.readObject()); //這里直接打印反序列化之后的對(duì)象信息
        ois.close();
    }
}
class Test implements Serializable{ //創(chuàng)建一個(gè)父類類用于創(chuàng)建序列化對(duì)象
}
class Test02 extends Test{    // 子類繼承父類
    // test02.data這個(gè)文件就是第三條中創(chuàng)建對(duì)象序列化之后的文件
    static int a = 1;    //這里我隨便添加了一個(gè)靜態(tài)屬性,然后執(zhí)行代碼
}

///下面是執(zhí)行結(jié)果
Exception in thread "main" java.io.InvalidClassException: night.Test02; local class incompatible: stream classdesc serialVersionUID = -4461189770521473347, local class serialVersionUID = -7303293535763263875
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1986)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
    at night.SerializeTest.main(SerializeTest.java:23)

居然報(bào)了異常?

這里為什么會(huì)報(bào)異常呢,簡單講一哈:序列化的時(shí)候會(huì)計(jì)算一個(gè)序列化版本號(hào)-----serialVersionUID,并且將這個(gè)版本號(hào)一同存放到文件中,在反序列化的時(shí)候會(huì)獲取此序列號(hào),并且會(huì)計(jì)算當(dāng)前類的serialVersionUID,如果兩個(gè)版本號(hào)不相等就會(huì)報(bào)如上異常,反之反序列化就可以成功。~

那么對(duì)于這種情況就沒有解決辦法了? 當(dāng)然是有的。

我們可以在類中直接聲明serialVersionUID為 final屬性,并讓其自動(dòng)賦初始值(這個(gè)值jvm肯定是計(jì)算過的了),格式如下:

private static final long serialVersionUID = 362498820763181265L;

這樣不管怎樣修改類的屬性,這個(gè)serialVersionUID都不會(huì)改變,這樣問題就解決了。

其實(shí)對(duì)于private static final long serialVersionUID = 362498820763181265L;這個(gè)東西,大家應(yīng)該都見過的,比如我這里拿的就是HashMap類源碼中的那個(gè)值。

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

相關(guān)文章

  • 使用LambdaQueryWrapper動(dòng)態(tài)加過濾條件?動(dòng)態(tài)Lambda

    使用LambdaQueryWrapper動(dòng)態(tài)加過濾條件?動(dòng)態(tài)Lambda

    這篇文章主要介紹了使用LambdaQueryWrapper動(dòng)態(tài)加過濾條件?動(dòng)態(tài)Lambda,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Spring中如何動(dòng)態(tài)注入Bean實(shí)例教程

    Spring中如何動(dòng)態(tài)注入Bean實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于Spring中如何動(dòng)態(tài)注入Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • spring mvc配置bootstrap教程

    spring mvc配置bootstrap教程

    這篇文章主要為大家詳細(xì)介紹了spring mvc配置bootstrap,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java容器類源碼詳解 Deque與ArrayDeque

    Java容器類源碼詳解 Deque與ArrayDeque

    這篇文章主要介紹了Java容器類源碼詳解 Deque與ArrayDeque,Deque 接口繼承自 Queue接口,但 Deque 支持同時(shí)從兩端添加或移除元素,因此又被成為雙端隊(duì)列。,需要的朋友可以參考下
    2019-06-06
  • Java使用正則提取字符串中的內(nèi)容的詳細(xì)步驟

    Java使用正則提取字符串中的內(nèi)容的詳細(xì)步驟

    這篇文章主要介紹了Java中使用正則表達(dá)式提取字符串內(nèi)容的方法,通過Pattern和Matcher類實(shí)現(xiàn),涵蓋編譯正則、查找匹配、分組捕獲、數(shù)字與郵箱提取場景,以及命名分組、非貪婪匹配等技巧,需要的朋友可以參考下
    2025-08-08
  • Java比較兩個(gè)對(duì)象是否相等的方法

    Java比較兩個(gè)對(duì)象是否相等的方法

    這篇文章主要介紹了Java比較兩個(gè)對(duì)象是否相等的方法,文中給出了三種方法,并通過代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • 詳解Java中數(shù)組判斷元素存在幾種方式比較

    詳解Java中數(shù)組判斷元素存在幾種方式比較

    這篇文章主要介紹了Java中數(shù)組判斷元素存在幾種方式比較,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • Java實(shí)現(xiàn)求二叉樹的深度和寬度

    Java實(shí)現(xiàn)求二叉樹的深度和寬度

    這篇文章主要介紹了Java實(shí)現(xiàn)求二叉樹的深度和寬度,本文分別給出代碼實(shí)例,需要的朋友可以參考下
    2015-06-06
  • 深入了解Java語言中的并發(fā)性選項(xiàng)有何不同

    深入了解Java語言中的并發(fā)性選項(xiàng)有何不同

    這篇文章主要介紹了深入了解Java語言中的并發(fā)性選項(xiàng)有何不同,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • Java?Spring?AOP源碼解析之事務(wù)實(shí)現(xiàn)原理

    Java?Spring?AOP源碼解析之事務(wù)實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了Java?Spring?AOP事務(wù)實(shí)現(xiàn)原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評(píng)論

龙口市| 当雄县| 炉霍县| 济源市| 湘潭市| 卓尼县| 乌拉特前旗| 安化县| 鹤峰县| 三门峡市| 济阳县| 夹江县| 白玉县| 乳山市| 绥滨县| 黎川县| 宿迁市| 阜新| 迭部县| 南召县| 郑州市| 青州市| 孟村| 玉溪市| 福清市| 大石桥市| 莫力| 太湖县| 隆德县| 六盘水市| 青岛市| 隆子县| 光泽县| 江安县| 北宁市| 西平县| 景泰县| 遂川县| 都安| 密山市| 桓台县|