午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術文章
文章詳情頁

Java SerialVersionUID作用詳解

瀏覽:169日期:2023-02-11 16:03:34
問題1:Serializable是什么

首先,說說Serializable是實現java將內存中的類存儲至硬盤中而使用的

一個類使用了Serializalbe接口,在序列化到文件時,會有一個SerialVersionUID。

這個東東是用于對類進行版本控制的。

首先看Person類清單:

=====

import java.io.Serializable; public class Person implements Serializable { //如果沒有指定serialVersionUID,系統會自動生成一個 private static final long serialVersionUID = 1L; private String name; //添加這么一個成員變量 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' ; //文件名 // 這里是把對象序列化到文件 Person crab = new Person(); crab.setName( 'Mr.Crab' ); //儲存到文件中 //objectToFile(crab,fileName); // 這里是把對象序列化到文件,我們先注釋掉,一會兒用 Person crabBack = (Person) getObjectFromFile(fileName); //Dog crabBack = (Dog) getObjectFromFile(fileName); System.out.println( 'Hi, My name is ' + crabBack.getName()); }}

=====

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

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

原因如下:

因為我們沒有指定SerialVersionUID,因此系統自動生成了一個serialVersionUID(這個是根據類名,變量名,方法名)生成的

但是改動后的Person中變量名有變動,于是這個UID就不一樣了,對于版本控制就無法讀取。

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

將Person代碼UID設置為1L,再重復上述步驟,不報錯。那么就意味著如果你選擇將UID設置為1L,就是選擇了兼容類的版本不一致。

PS:為什么說自動生成的 serialVersionUID是根據 類名,變量名,方法名,因為當你在原有的類的方法內進行添加內容,并不是對最后系統生成的UID造成影響,即不會拋出錯誤

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

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

運行結果拋出錯誤:

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

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

到此這篇關于Java SerialVersionUID作用詳解的文章就介紹到這了,更多相關Java SerialVersionUID內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 欧美一区二区三区在线播放 | 中文字幕影院 | 欧洲美女与动交zozzo | 精品国产一区二区三区久久久久久 | 国产极品国产极品 | 免费网站91 | 欧美激情视频在线播放 | 永久在线视频 | 亚洲第一页乱 | 久久精品免费观看 | 欧美ⅹxxxxxx| 午夜精品一区二区三区视频 | 亚洲一区在线观看视频 | 性高潮久久久久久久 | 香蕉在线影院 | 中文字幕理伦片免费看 | 欧美成人午夜精品免费 | 欧美日韩亚洲国产综合 | 亚洲欧洲免费视频 | 日韩高清黄色 | 日日操日日 | 超碰在线播放97 | 日本在线观看免费 | 中文在线观看免费视频 | 天天干狠狠爱 | 日韩中文视频 | 国产亚洲精品久久久久久 | 成人av在线网址 | 久久99国产精品视频 | 成人午夜免费在线观看 | 国内精品久久久久久久 | 日韩在线视频网站 | 九九精品在线播放 | 91嫩草在线| 战狼4免费播放观看在线视频 | 夜夜操综合 | 午夜免费看 | 91香蕉国产在线观看软件 | 黄色成人小视频 | 日本不卡视频一区二区 | 久久国产精品免费视频 |