亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

Java SerialVersionUID作用詳解

瀏覽:108日期:2023-02-11 16:03:34
問題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; }}

===== 然后是測試類清單 =====

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類如上,將測試類代碼中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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产在线步兵一区二区三区 | 日本a级精品一区二区三区 日本a级毛片免费视频播放 | 中文国产成人精品久久一区 | 9久久99久久久精品齐齐综合色圆 | 久草日韩 | 特黄特色大片免费播放路01 | 欧美精品国产制服第一页 | 久草国产在线播放 | 色青青草原桃花久久综合 | 一级毛片不卡免费看老司机 | 欧美中文字幕在线看 | 亚洲综合欧美综合 | 制服丝袜在线视频香蕉 | 亚洲欧美日韩在线精品一区二区 | 亚洲免费视频在线观看 | 亚洲精品国产综合久久一线 | 热99re久久精品精品免费 | 特级a做爰全过程片 | 精品国产一区在线观看 | 自拍三级| 性久久久久久久久 | 亚洲精品区在线播放一区二区 | 日韩精品永久免费播放平台 | 国产三级久久久精品三级 | 热er99久久6国产精品免费 | 中文字幕在线观看不卡视频 | 国产成人亚洲精品91专区高清 | 亚洲一级免费视频 | 91久久国产综合精品 | 毛片的网址| 91专区在线 | 久热久操| 国产成人福利美女观看视频 | 9久re在线观看视频精品 | 欧美日韩一区二区在线视频 | 免费一级欧美性大片 | 牛人国产偷窥女洗浴在线观看 | 在线视频 亚洲 | www.色亚洲| 色在线看| 国产精品久久一区 |