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

Java SerialVersionUID作用詳解

 更新時(shí)間:2021年08月12日 11:12:02   作者:wy_erhu  
這篇文章主要介紹了Java SerialVersionUID作用詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

問題1:Serializable是什么

首先,說說Serializable是實(shí)現(xiàn)java將內(nèi)存中的類存儲(chǔ)至硬盤中而使用的

一個(gè)類使用了Serializalbe接口,在序列化到文件時(shí),會(huì)有一個(gè)SerialVersionUID。

這個(gè)東東是用于對(duì)類進(jìn)行版本控制的。

首先看Person類清單:

=====

import  java.io.Serializable;
 
public  class  Person  implements  Serializable {
     
     //如果沒有指定serialVersionUID,系統(tǒng)會(huì)自動(dòng)生成一個(gè)
     private  static  final  long  serialVersionUID = 1L;
     private  String name;
     //添加這么一個(gè)成員變量  
     private  String address;    //序列化后如果之前版本沒有,就為null
 
     public  String getName() {
//      int a = 100;
//      for(int i=0;i<a;i++){
//          name+=i;
//      }
         return  name;
     }
     public  void  setName(String name) {
         this .name = name;
     }
}

===== 然后是測(cè)試類清單 =====

import  java.io.FileInputStream;
import  java.io.FileNotFoundException;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.ObjectInputStream;
import  java.io.ObjectOutputStream;
 
/**
  * if Object implements Serializable without Uid,
  * system will automatically give this object a uid by algorithm
  * @author v11
  * @date 2014年9月18日
  * @version 1.0
  */
public  class  WhySerialversionUID {
 
     public  static  void  objectToFile(Object obj,String fileName)  throws  Exception{
         ObjectOutputStream oo =  new  ObjectOutputStream( new  FileOutputStream(
                 fileName));
         oo.writeObject(obj);
         oo.close();
     }
 
     public  static  Object getObjectFromFile(String fileName)  throws  Exception {
         ObjectInputStream oi =  new  ObjectInputStream( new  FileInputStream(
                 fileName));
         Person crab_back = (Person) oi.readObject();
         oi.close();
         return  crab_back;
     }
     public  static  void  main(String[] args)  throws  Exception {
         String fileName =  "crab_file" ; //文件名
         
         // 這里是把對(duì)象序列化到文件
         Person crab =  new  Person();
         crab.setName( "Mr.Crab" );
         
         //儲(chǔ)存到文件中
         //objectToFile(crab,fileName);
 
         // 這里是把對(duì)象序列化到文件,我們先注釋掉,一會(huì)兒用
         Person crabBack = (Person) getObjectFromFile(fileName);
         //Dog crabBack = (Dog) getObjectFromFile(fileName);
         System.out.println( "Hi, My name is "  + crabBack.getName());
 
     }
}

=====

1.對(duì)于Person類中,將變量 address和SerialVersionUID注釋掉,存儲(chǔ)到文件,并讀出。顯示正常

2.將變量address還原,讀取原來存儲(chǔ)的文件,顯示異常。拋出錯(cuò)誤 InvalidClassException。

原因如下:

因?yàn)槲覀儧]有指定SerialVersionUID,因此系統(tǒng)自動(dòng)生成了一個(gè)serialVersionUID(這個(gè)是根據(jù)類名,變量名,方法名)生成的

但是改動(dòng)后的Person中變量名有變動(dòng),于是這個(gè)UID就不一樣了,對(duì)于版本控制就無法讀取。

所以,大家在很多代碼里看到把UID設(shè)置為1L,就是Person代碼中那樣。

將Person代碼UID設(shè)置為1L,再重復(fù)上述步驟,不報(bào)錯(cuò)。那么就意味著如果你選擇將UID設(shè)置為1L,就是選擇了兼容類的版本不一致。

PS:為什么說自動(dòng)生成的 serialVersionUID是根據(jù) 類名,變量名,方法名,因?yàn)楫?dāng)你在原有的類的方法內(nèi)進(jìn)行添加內(nèi)容,并不是對(duì)最后系統(tǒng)生成的UID造成影響,即不會(huì)拋出錯(cuò)誤

問題2:所有類都設(shè)置為1L,是否有不良影響,不同類會(huì)不會(huì)沖突

public  class  Dog  implements  Serializable{
     
     private  static  final  long  serialVersionUID = 1L;
     private  String name;
     
     public  String getName() {
         return  name;
     }
 
     public  void  setName(String name) {
         this .name = name;
     }
     
}

新定義Dog類如上,將測(cè)試類代碼中Dog的賦值注釋去掉

 //Dog crabBack = (Dog) getObjectFromFile(fileName);

運(yùn)行結(jié)果拋出錯(cuò)誤:

Exception in thread "main" java.lang.ClassCastException: serializable.Person cannot be cast to serializable.Dog

說明serializable在不同類一間并不矛盾。

到此這篇關(guān)于Java SerialVersionUID作用詳解的文章就介紹到這了,更多相關(guān)Java SerialVersionUID內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 反射(Reflect)詳解

    Java 反射(Reflect)詳解

    這篇文章主要介紹了JAVA 反射機(jī)制的相關(guān)知識(shí),文中講解的非常細(xì)致,代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • Java中隨機(jī)函數(shù)變換的示例詳解

    Java中隨機(jī)函數(shù)變換的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java中隨機(jī)函數(shù)的變換,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • java程序員自己的圖片轉(zhuǎn)文字OCR識(shí)圖工具分享

    java程序員自己的圖片轉(zhuǎn)文字OCR識(shí)圖工具分享

    這篇文章主要介紹了java程序員自己的圖片轉(zhuǎn)文字OCR識(shí)圖工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解決mybatis-plus新增數(shù)據(jù)自增ID變無序問題

    解決mybatis-plus新增數(shù)據(jù)自增ID變無序問題

    這篇文章主要介紹了解決mybatis-plus新增數(shù)據(jù)自增ID變無序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-07-07
  • SpringBoot的@ControllerAdvice處理全局異常詳解

    SpringBoot的@ControllerAdvice處理全局異常詳解

    這篇文章主要介紹了SpringBoot的@ControllerAdvice處理全局異常詳解,但有時(shí)卻往往會(huì)產(chǎn)生一些bug,這時(shí)候就破壞了返回?cái)?shù)據(jù)的一致性,導(dǎo)致調(diào)用者無法解析,所以我們常常會(huì)定義一個(gè)全局的異常攔截器,需要的朋友可以參考下
    2024-01-01
  • JVM完全解讀之Metaspace解密源碼分析

    JVM完全解讀之Metaspace解密源碼分析

    通過這篇文章,你將可以了解到,為什么會(huì)有metaspace?metaspace的組成,metaspace的VM參數(shù),jstat里我們應(yīng)該關(guān)注metaspace的哪些值,有需要的朋友可以借鑒參考下
    2022-01-01
  • Java Math類的三個(gè)方法ceil,floor,round用法

    Java Math類的三個(gè)方法ceil,floor,round用法

    這篇文章主要介紹了Java Math類的三個(gè)方法ceil,floor,round用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring?Boot?應(yīng)用的熱部署配置方法

    Spring?Boot?應(yīng)用的熱部署配置方法

    熱部署,簡(jiǎn)單來說,就是代碼修改后不需重啟項(xiàng)目就可自動(dòng)加載出新的內(nèi)容,這篇文章主要介紹了Spring?Boot?應(yīng)用的熱部署配置?,需要的朋友可以參考下
    2022-11-11
  • Java實(shí)現(xiàn)新建有返回值的線程的示例詳解

    Java實(shí)現(xiàn)新建有返回值的線程的示例詳解

    本文主要介紹了一個(gè)Java多線程的例題,題目是:使用ThreadLocal管理一號(hào)和二號(hào)線程,分別存入100元,在三號(hào)線程中使用利用一號(hào)和二號(hào)的計(jì)算結(jié)果來算出賬戶的實(shí)際金額。感興趣的可以了解一下
    2022-09-09
  • Java WebService 簡(jiǎn)單實(shí)例(附實(shí)例代碼)

    Java WebService 簡(jiǎn)單實(shí)例(附實(shí)例代碼)

    本篇文章主要介紹了Java WebService 簡(jiǎn)單實(shí)例(附實(shí)例代碼), Web Service 是一種新的web應(yīng)用程序分支,他們是自包含、自描述、模塊化的應(yīng)用,可以發(fā)布、定位、通過web調(diào)用。有興趣的可以了解一下
    2017-01-01

最新評(píng)論