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

詳解Java對(duì)象序列化為什么要使用SerialversionUID

 更新時(shí)間:2020年11月06日 09:54:01   作者:GraceJava  
這篇文章主要介紹了詳解Java對(duì)象序列化為什么要使用SerialversionUID,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、首先談?wù)劄槭裁匆蛄谢瘜?duì)象

- 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。
- 把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化。

對(duì)象的序列化主要有兩種用途:
  1) 把對(duì)象的字節(jié)序列永久地保存到硬盤上,通常存放在一個(gè)文件中;
  2) 在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。

在很多應(yīng)用中,需要對(duì)某些對(duì)象進(jìn)行序列化,讓它們離開內(nèi)存空間,入住物理硬盤,以便長(zhǎng)期保存。比如最常見的是Web服務(wù)器中的Session對(duì)象,當(dāng)有 10萬(wàn)用戶并發(fā)訪問(wèn),就有可能出現(xiàn)10萬(wàn)個(gè)Session對(duì)象,內(nèi)存可能吃不消,于是Web容器就會(huì)把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對(duì)象還原到內(nèi)存中。

當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象

2、為什么要使用SerialversionUID呢

簡(jiǎn)單看一下 Serializable接口的說(shuō)明

If a serializable class does not explicitly declare a serialVersionUID,
then the serialization runtime will calculate a default
serialVersionUID value for that class based on various aspects of the class,
as described in the Java(TM) Object Serialization Specification.

如果用戶沒有自己聲明一個(gè)serialVersionUID,接口會(huì)默認(rèn)生成一個(gè)serialVersionUID
However, it is stronglyrecommended that all serializable classes explicitly declareserialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpectedInvalidClassExceptions during deserialization.
但是強(qiáng)烈建議用戶自定義一個(gè)serialVersionUID,因?yàn)槟J(rèn)的serialVersinUID對(duì)于class的細(xì)節(jié)非常敏感,反序列化時(shí)可能會(huì)導(dǎo)致InvalidClassException這個(gè)異常。
e.g:1.使用默認(rèn)的serialVersionUID

我們先建一個(gè)實(shí)體類Person 實(shí)現(xiàn)Serializable接口

public class Person implements Serializable {
  

  private int age;
  private String name;
  private String sex;
 

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}

然后去序列化和反序列化它

public class Person implements Serializable {
  

  private int age;
  private String name;
  private String sex;
 

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}

結(jié)果如圖

這里寫圖片描述

  e.g:2
  如果我們先盡心序列化,然后在反序列化之前修改了Person類會(huì)怎樣呢

public class Person implements Serializable {
  
  private int age;
  private String name;
  private String sex;
  private String address;

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}

運(yùn)行結(jié)果

這里寫圖到底片描述 

 可以看到,當(dāng)我們修改Person類的時(shí)候,Person類對(duì)應(yīng)的SerialversionUID也變化了,而序列化和反序列化就是通過(guò)對(duì)比其SerialversionUID來(lái)進(jìn)行的,一旦SerialversionUID不匹配,反序列化就無(wú)法成功。在實(shí)際的生產(chǎn)環(huán)境中,我們可能會(huì)建一系列的中間Object來(lái)反序列化我們的pojo,為了解決這個(gè)問(wèn)題,我們就需要在實(shí)體類中自定義SerialversionUID。
  e.g:3 在Person類中加入自定義SerialversionUID

public class Person implements Serializable {
  
  private static final long serialVersionUID = -5809782578272943999L;
  private int age;
  private String name;
  private String sex;
  private String address;

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}

不管我們序列化之后如何更改我們的Person(不刪除原有字段),最終都可以反序列化成功。

到此這篇關(guān)于詳解Java對(duì)象序列化為什么要使用SerialversionUID的文章就介紹到這了,更多相關(guān)Java對(duì)象序列化SerialversionUID內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java當(dāng)中讓事務(wù)回滾的幾種方式

    Java當(dāng)中讓事務(wù)回滾的幾種方式

    這篇文章主要給大家介紹了關(guān)于Java當(dāng)中讓事務(wù)回滾的幾種方式, 事務(wù)回滾通常用于在某些操作失敗時(shí)取消之前已執(zhí)行的所有操作,這樣,我們就可以保證數(shù)據(jù)的一致性,需要的朋友可以參考下
    2023-08-08
  • java中l(wèi)ombok的@Data引發(fā)問(wèn)題詳解

    java中l(wèi)ombok的@Data引發(fā)問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于java中l(wèi)ombok的@Data引發(fā)問(wèn)題的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 淺析Java Scanner 類的用法

    淺析Java Scanner 類的用法

    這篇文章主要介紹了Java Scanner 類的用法,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 詳解Java的面向?qū)ο蠛兔嫦蜻^(guò)程

    詳解Java的面向?qū)ο蠛兔嫦蜻^(guò)程

    我們知道,Java是面向?qū)ο蟮木幊陶Z(yǔ)言,但是至今仍有不少同學(xué)還不太懂”面向?qū)ο蟆暗拇_切含義,今天這篇文章就帶大家真正地認(rèn)識(shí)面向?qū)ο?,感興趣的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)
    2023-05-05
  • java泛型學(xué)習(xí)示例

    java泛型學(xué)習(xí)示例

    Java泛型(Generics)是JDK5開始引入的一個(gè)新特性,允許在定義類和接口的時(shí)候使用類型參數(shù)(Type Parameter)。下面是學(xué)習(xí)泛型的示例
    2014-04-04
  • springboot項(xiàng)目數(shù)據(jù)庫(kù)密碼如何加密

    springboot項(xiàng)目數(shù)據(jù)庫(kù)密碼如何加密

    在我們?nèi)粘i_發(fā)中,我們可能很隨意把數(shù)據(jù)庫(kù)密碼直接明文暴露在配置文件中,今天就來(lái)聊聊在springboot項(xiàng)目中如何對(duì)數(shù)據(jù)庫(kù)密碼進(jìn)行加密,感興趣的可以了解一下
    2021-07-07
  • java定義受限制的類型參數(shù)操作

    java定義受限制的類型參數(shù)操作

    這篇文章主要介紹了java定義受限制的類型參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java獲取中文拼音首字母工具類定義與用法實(shí)例

    java獲取中文拼音首字母工具類定義與用法實(shí)例

    這篇文章主要介紹了java獲取中文拼音首字母工具類定義與用法,結(jié)合實(shí)例形式分析了java獲取中文拼音首字母工具類的具體定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • Mybatis實(shí)現(xiàn)聯(lián)表查詢并且分頁(yè)功能

    Mybatis實(shí)現(xiàn)聯(lián)表查詢并且分頁(yè)功能

    這篇文章主要介紹了Mybatis實(shí)現(xiàn)聯(lián)表查詢并且分頁(yè)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java編程實(shí)現(xiàn)用hash方法切割文件

    Java編程實(shí)現(xiàn)用hash方法切割文件

    這篇文章主要介紹了Java編程實(shí)現(xiàn)用hash方法切割文件,簡(jiǎn)單介紹了hash的概念,然后分享了使用方法示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12

最新評(píng)論

宜昌市| 邯郸市| 姜堰市| 大悟县| 河东区| 内乡县| 宾川县| 稻城县| 临清市| 汉川市| 武胜县| 凉山| 鸡西市| 通江县| 黑水县| 定南县| 沐川县| 宜章县| 汉寿县| 新昌县| 库伦旗| 海兴县| 定日县| 古蔺县| 石台县| 石景山区| 扬中市| 手游| 东乡族自治县| 桦川县| 怀柔区| 米林县| 松原市| 安岳县| 金平| 常宁市| 任丘市| 合肥市| 柞水县| 沅江市| 台江县|