Java SerialVersionUID作用詳解
問題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程序員自己的圖片轉(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變無序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-07-07SpringBoot的@ControllerAdvice處理全局異常詳解
這篇文章主要介紹了SpringBoot的@ControllerAdvice處理全局異常詳解,但有時(shí)卻往往會(huì)產(chǎn)生一些bug,這時(shí)候就破壞了返回?cái)?shù)據(jù)的一致性,導(dǎo)致調(diào)用者無法解析,所以我們常常會(huì)定義一個(gè)全局的異常攔截器,需要的朋友可以參考下2024-01-01Java Math類的三個(gè)方法ceil,floor,round用法
這篇文章主要介紹了Java Math類的三個(gè)方法ceil,floor,round用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java實(shí)現(xiàn)新建有返回值的線程的示例詳解
本文主要介紹了一個(gè)Java多線程的例題,題目是:使用ThreadLocal管理一號(hào)和二號(hào)線程,分別存入100元,在三號(hào)線程中使用利用一號(hào)和二號(hào)的計(jì)算結(jié)果來算出賬戶的實(shí)際金額。感興趣的可以了解一下2022-09-09Java 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