91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

serialVersionUID的作用是什么

發布時間:2021-06-25 15:16:57 來源:億速云 閱讀:123 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關serialVersionUID的作用是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

簡單來說,Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常。(InvalidCastException)

serialVersionUID有兩種顯示的生成方式:        一個是默認的1L,比如:private static final long serialVersionUID = 1L;        一個是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段,比如:        private static final   long     serialVersionUID = xxxxL; 當你一個類實現了Serializable接口,如果沒有顯示的定義serialVersionUID,Eclipse會提供這個      提示功能告訴你去定義 。在Eclipse中點擊類中warning的圖標一下,Eclipse就會      自動給定兩種生成的方式。如果不想定義它,在Eclipse的設置中也       可以把它關掉的,設置如下:         Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==>         Potential programming problems         將Serializable class without serialVersionUID的warning改成ignore即可。
當實現java.io.Serializable接口的實體(類)沒有顯式地定義一個名為serialVersionUID,類型為long的變量時,Java序列化機制會根據編譯的class(它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的)自動生成一個serialVersionUID作序列化版本比較用,這種情況下,如果class文件(類名,方法明等)沒有發生變化(增加空格,換行,增加注釋,等等),就算再編譯多次,serialVersionUID也不會變化的.

如果我們不希望通過編譯來強制劃分軟件版本,即實現序列化接口的實體能夠兼容先前版本,未作更改的類,就需要顯式地定義一個名為serialVersionUID,類型為long的變量,不修改這個變量值的序列化實體都可以相互進行串行化和反串行化。

如果你沒有考慮到兼容性問題時,就把它關掉,不過有這個功能是好的,只要任何類別實現了Serializable這個接口的話,如果沒有加入 serialVersionUID,Eclipse都會給你warning提示,這個serialVersionUID為了讓該類別 Serializable向后兼容。

問題一:假設有A端和B端,如果2處的serialVersionUID不一致,會產生什么錯誤呢?

問題二:假設2處serialVersionUID一致,如果A端增加一個字段,B端不變,會是什么情況呢?

問題三:假設2處serialVersionUID一致,如果B段增加一個字段,A端不變,會是什么情況呢?

問題四:假設2處serialVersionUID一致,如果A端減少一個字段,B端不變,會是什么情況呢?

問題五:假設2處serialVersionUID一致,如果B端減少一個字段,A端不變,會是什么情況呢?

例子如下:寫2個類,類名相同,字段相同,方法相同.放在不同的包里,來模仿A端和B端.

實體類:在本例中,在測試類SerialTest執行前代表A端,然后,在測試類DeserialTest執行前代表B端.

package com.test; import java.io.Serializable;

public class Serial implements Serializable{

/**   *   */

private static final long serialVersionUID = 6977402643848374753L;

int id;      

String name;      

public Serial(int id, String name) {          

this.id = id;          

this.name = name;      

}      

public String toString() {          

return "DATA: " + id + " " +name;       

  }   }

測試類,代表A端的序列化

package com.test.serializable;

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream;

public class SerialTest {

/**   * @param args   */

public static void main(String[] args) {  

// TODO Auto-generated method stub  

Serial serial1 = new Serial(1,"song");  

System.out.println("Object Serial"+serial1);    

try {   

FileOutputStream fos = new FileOutputStream("serialTest.txt");   

ObjectOutputStream oos = new ObjectOutputStream(fos);   

oos.writeObject(serial1);   

oos.flush();   

oos.close();      

  } catch (FileNotFoundException e) {  

  // TODO Auto-generated catch block  

  e.printStackTrace();  

} catch (IOException e) {  

  // TODO Auto-generated catch block   

e.printStackTrace();  

} } }

測試類,代表B端的反序列化

package com.test.serializable;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream;

public class DeserialTest {

/**   * @param args   */

public static void main(String[] args) {

  // TODO Auto-generated method stub  

Serial serial2 ;  

try {

   FileInputStream fis = new FileInputStream("serialTest.txt");   

ObjectInputStream ois = new ObjectInputStream(fis);  

  serial2 = (Serial)ois.readObject();

   ois.close();   

System.out.println("Object Deserial"+serial2);  

} catch (FileNotFoundException e) {   

// TODO Auto-generated catch block   

e.printStackTrace();  

} catch (IOException e) {   

// TODO Auto-generated catch block  

  e.printStackTrace();  

} catch (ClassNotFoundException e) {   

// TODO Auto-generated catch block   

e.printStackTrace();   }   }

}

問題一:假設有A端和B端,如果2處的serialVersionUID不一致,會產生什么錯誤呢?

答案如下:

1)先執行測試類SerialTest,然后修改serialVersion值(或注釋掉serialVersion并編譯),再執行測試類DeserialTest,報錯:

java.io.InvalidClassException: com.test.serializable.Serial; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 11

2)A端和B端都沒顯示的寫serialVersionUID,實體類沒有改動(如果class文件(類名,方法明等)沒有發生變化(增加空格,換行,增加注釋,等等),).序列化,反序列化正常.

問題二:假設2處serialVersionUID一致,如果A端增加一個字段,B端不變,會是什么情況呢?

答案二: 序列化,反序列化正常,A端增加的字段丟失(被B端忽略).

問題五:假設2處serialVersionUID一致,如果B端減少一個字段,A端不變,會是什么情況呢?

答案:與問題二類似,序列化,反序列化正常,B端字段少于A端,A端多的字段值丟失(被B端忽略).

問題三:假設2處serialVersionUID一致,如果B段增加一個字段,A端不變,會是什么情況呢?

問題四:假設2處serialVersionUID一致,如果A端減少一個字段,B端不變,會是什么情況呢?(與問題三類似,四答案:序列化,反序列化正常,B端字段多余A端,B端多出的字段被賦予對應類型的默認值)

答案三: 序列化,反序列化正常,B端新增加的int字段被賦予了默認值0.  

例子如下:

3)先執行SerialTest,然后在實體類增加一個字段age,再執行測試類DeserialTest.

package com.test.serializable;

import java.io.Serializable;

public class Serial implements Serializable {

/**   *   */ private static final long serialVersionUID = -2337937881709830076L;

/**   *   */ //private static final long serialVersionUID = 1L; int id;       

    String name;      

public Serial(int id, String name) {     

      this.id = id;          

this.name = name;      

}      

public String toString() {       

    return "DATA: " + id + " " +name;        

}    

public int age ;//在B端增加一個新字段 }

相應的修改測試類DeserialTest,打印出age的值.

package com.test.serializable;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream;

public class DeserialTest {

/**   * @param args   */

public static void main(String[] args) {  

// TODO Auto-generated method stub  

Serial serial2 ;

  try {

   FileInputStream fis = new FileInputStream("serialTest.txt");   

ObjectInputStream ois = new ObjectInputStream(fis);  

  serial2 = (Serial)ois.readObject();   

ois.close();   

System.out.println("Object Deserial"+serial2+" age="+serial2.age);

  } catch (FileNotFoundException e) {   

// TODO Auto-generated catch block

   e.printStackTrace();  

} catch (IOException e) {   

// TODO Auto-generated catch block  

  e.printStackTrace();  

} catch (ClassNotFoundException e) {   

// TODO Auto-generated catch block   

e.printStackTrace();   }   }

}

打印結果如下:

Object DeserialDATA: 1 song age=0

說明序列化,反序列化正常,B端新增加的int字段被賦予了默認值0.

以上就是serialVersionUID的作用是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

饶平县| 长武县| 徐州市| 大厂| 赤城县| 法库县| 平陆县| 河西区| 章丘市| 余江县| 昔阳县| 台东县| 南澳县| 建宁县| 图木舒克市| 古浪县| 汝州市| 武邑县| 囊谦县| 尤溪县| 镇康县| 加查县| 厦门市| 达孜县| 定陶县| 景谷| 大同县| 乌兰察布市| 新邵县| 武冈市| 丁青县| 海丰县| 萨迦县| 班戈县| 沾化县| 九龙坡区| 来宾市| 夏邑县| 曲周县| 福贡县| 德清县|