一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

世界速看:java的序列化機制是什么?java序列化ID的作用

來源:CSDN 時間:2023-03-07 11:31:48

序列化ID的作用:

序列化ID決定著是否能夠成功反序列化!簡單來說,java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地實體類中的serialVersionUID進行比較,如果相同則認為是一致的,便可以進行反序列化,否則就會報序列化版本不一致的異常。

通俗意思就是:


(相關資料圖)

不加序列化ID:

某個類進行序列化保存本地或者進行網絡傳輸反序列化時,如果修改了該類,則序列化ID不一致,報錯!

加序列化:

某個類進行序列化保存本地或者進行網絡傳輸反序列化時,如果修改了該類,則原本類中存在的值,可取出,不存在的,取默認,不會報錯!

看例子:

1、不加序列化ID執行序列化:

import java.io.*;public class Solution implements Serializable {    String name = "abc";    public static void main(String[] args) throws IOException, ClassNotFoundException {        Solution s = new Solution();        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("a.txt"));        objectOutputStream.writeObject(s);        objectOutputStream.close();    }}

2、修改類,在類屬性中添加age屬性,進行反序列化:

import java.io.*;public class Solution implements Serializable {    String name = "abc";    int age = 10;    public static void main(String[] args) throws IOException, ClassNotFoundException {        FileInputStream fis = new FileInputStream("a.txt");        ObjectInputStream inputStream = new ObjectInputStream(fis);        Solution s1 = (Solution) inputStream.readObject();        System.out.println(s1.name);        System.out.println(s1.age);    }}

3、結果:

可以發現,修改了類之后,serialVersionUID發生了改變,反序列化失敗,連name屬性都提取不出!

1、加序列化ID進行序列化:

import java.io.*;public class Solution implements Serializable {    private final static long serialVersionUID = 20000L;    String name = "abc";    public static void main(String[] args) throws IOException, ClassNotFoundException {        Solution s = new Solution();        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("a.txt"));        objectOutputStream.writeObject(s);        objectOutputStream.close();    }}

2、在類中添加age屬性,進行反序列化:

import java.io.*;public class Solution implements Serializable {    private final static long serialVersionUID = 20000L;    String name = "abc";     int age = 10;    public static void main(String[] args) throws IOException, ClassNotFoundException {        FileInputStream fis = new FileInputStream("a.txt");        ObjectInputStream inputStream = new ObjectInputStream(fis);        Solution s1 = (Solution) inputStream.readObject();        System.out.println(s1.name);        System.out.println(s1.age);    }}

3、結果:

可以看到,name值取出來了,而且age值為默認0!

因為age沒有進行序列化,所以保存的字節流文件中并沒有age對應值,我們只能取出Solution類中的name屬性的值,因為序列化的字節流中存在,當序列化ID相同時,反序列化執行成功!

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 主站蜘蛛池模板: 嘉黎县| 卢龙县| 增城市| 上高县| 重庆市| 达拉特旗| 霍州市| 廉江市| 夏津县| 平和县| 古蔺县| 湟中县| 得荣县| 岳池县| 金山区| 嘉义市| 海丰县| 丰城市| 仁寿县| 新安县| 吉林省| 休宁县| 曲靖市| 石屏县| 婺源县| 明溪县| 阿勒泰市| 绵阳市| 修水县| 米易县| 潼南县| 古浪县| 拉孜县| 峨眉山市| 陆丰市| 调兵山市| 化州市| 南涧| 光泽县| 丹棱县| 台中市|