欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java對象序列化為什么要使用SerialversionUID

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

1、首先談談為什么要序列化對象

- 把對象轉換為字節(jié)序列的過程稱為對象的序列化。
- 把字節(jié)序列恢復為對象的過程稱為對象的反序列化。

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

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

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

2、為什么要使用SerialversionUID呢

簡單看一下 Serializable接口的說明

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.

如果用戶沒有自己聲明一個serialVersionUID,接口會默認生成一個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.
但是強烈建議用戶自定義一個serialVersionUID,因為默認的serialVersinUID對于class的細節(jié)非常敏感,反序列化時可能會導致InvalidClassException這個異常。
e.g:1.使用默認的serialVersionUID

我們先建一個實體類Person 實現(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;
  }
}

結果如圖

這里寫圖片描述

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

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;
  }
}

運行結果

這里寫圖到底片描述 

 可以看到,當我們修改Person類的時候,Person類對應的SerialversionUID也變化了,而序列化和反序列化就是通過對比其SerialversionUID來進行的,一旦SerialversionUID不匹配,反序列化就無法成功。在實際的生產環(huán)境中,我們可能會建一系列的中間Object來反序列化我們的pojo,為了解決這個問題,我們就需要在實體類中自定義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(不刪除原有字段),最終都可以反序列化成功。

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

相關文章

  • Java BeanUtils工具類常用方法講解

    Java BeanUtils工具類常用方法講解

    這篇文章主要介紹了Java BeanUtils工具類常用方法講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Java定時器通信協(xié)議管理模塊Timer詳解

    Java定時器通信協(xié)議管理模塊Timer詳解

    這篇文章主要介紹了Java定時器通信協(xié)議管理模塊Timer,?Timer一般指定時器(通信協(xié)議管理模塊)人類最早使用的定時工具是沙漏或水漏,但在鐘表誕生發(fā)展成熟之后,人們開始嘗試使用這種全新的計時工具來改進定時器,達到準確控制時間的目的
    2022-08-08
  • Java整合Jackson實現(xiàn)反序列化器流程

    Java整合Jackson實現(xiàn)反序列化器流程

    Jackson是一個開源的Java序列化和反序列化工具,可以將Java對象序列化為XML或JSON格式的字符串,以及將XML或JSON格式的字符串反序列化為Java對象。由于其使用簡單,速度較快,且不依靠除JDK外的其他庫,被眾多用戶所使用
    2023-01-01
  • Java實現(xiàn)五子棋游戲(2.0)

    Java實現(xiàn)五子棋游戲(2.0)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Spring @Cacheable注解中key的使用詳解

    Spring @Cacheable注解中key的使用詳解

    這篇文章主要介紹了Spring @Cacheable注解中key的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java靜態(tài)代理的含義及用法

    java靜態(tài)代理的含義及用法

    在本篇文章里小編給大家整理的是一篇關于java靜態(tài)代理的含義及用法,有需要的朋友們可以跟著學習參考下。
    2021-06-06
  • java處理數(shù)據(jù)庫不支持的emoji表情符問題解決

    java處理數(shù)據(jù)庫不支持的emoji表情符問題解決

    這篇文章主要介紹了java處理數(shù)據(jù)庫不支持的emoji表情符問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Springboot ApplicationRunner的使用解讀

    Springboot ApplicationRunner的使用解讀

    這篇文章主要介紹了Springboot ApplicationRunner的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • SkyWalking自定義鏈路追蹤實現(xiàn)步驟

    SkyWalking自定義鏈路追蹤實現(xiàn)步驟

    本文詳細介紹了如何使用SkyWalking進行自定義鏈路追蹤的步驟,包括POM文件依賴和邏輯業(yè)務代碼的編寫,文章最后推薦了腳本之家作為進一步學習的資源
    2024-02-02
  • 詳解SpringBoot是如何整合JPA的

    詳解SpringBoot是如何整合JPA的

    借助于開發(fā)框架,我們已經(jīng)不用編寫原始的訪問數(shù)據(jù)庫的代碼,也不用調用JDBC或者連接池等諸如此類的被稱作底層的代碼,我們將從更高的層次上訪問數(shù)據(jù)庫,本章我們將詳細介紹在Springboot中使用 Spring Data JPA 來實現(xiàn)對數(shù)據(jù)庫的操作,需要的朋友可以參考下
    2021-06-06

最新評論