一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java SerialVersionUID作用詳解

Java SerialVersionUID作用詳解

2021-11-16 12:26wy_erhu Java教程

這篇文章主要介紹了Java SerialVersionUID作用詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

問題1:Serializable是什么

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

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

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

首先看Person類清單:

=====

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
     }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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,是否有不良影響,不同類會不會沖突

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/fjndwy/article/details/39374231

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 狠狠干综合网 | 女子监狱第二季未删减在线看 | 青春学堂在线观看 | 久久精品小视频 | 全是女性放屁角色的手游 | 四虎国产成人亚洲精品 | 蜜桃影像传媒推广 | 国内精品一区视频在线播放 | 国内精品一区二区在线观看 | 国内精品91久久久久 | 福利入口在线观看 | 香蕉 在线播放 | 亚洲福利一区二区精品秒拍 | 精品视频手机在线观看免费 | 国产在线精品99一卡2卡 | 午夜免费体验30分 | 操弄哥哥的108种姿势 | 国产成人精品免费大全 | 秋霞鲁丝影院久久人人综合 | 成人福利 | 大象视频污| 欧美最猛性xxxxx男男 | 短篇同学新婚h系列小说 | 色444| 青青草人人 | 逼中极品| 国产精自产拍久久久久久 | haodiaose在线精品免费观看 | 久久永久影院免费 | 免费高清视频在线观看 | 亚洲精品久久久992KVTV | 俄罗斯海滩厕所偷窥 | 免费高清www动漫视频播放器 | 国产成人在线免费观看 | 精品人人做人人爽久久久 | 亚洲成年www | 99精品影视 | 亚洲精品αv一区二区三区 亚洲精品91大神在线观看 | 精品国产自在现线拍国语 | 亚洲 欧美 清纯 校园 另类 | 天天干天天操天天爽 |