serialversionuid的作用_為什么阿里Java規約要求謹慎修改serialVersionUID字段

serialVersionUID簡要介紹

serialVersionUID是在Java序列化、反序列化對象時起作用的一個字段。Java的序列化機制是通過判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是InvalidClassException。

序列化是一種把對象持久化到外部的手段。在網絡傳輸等場景中應用廣泛,如Dubbo等框架。類通過實現 java.io.Serializable 接口以啟用其序列化功能。

阿里Java規約中的描述

a386363205d08c128b9d50db69f28dc9.png

阿里規約中強制性的提醒,修改serialVersionUID字段,會引起反序列化失敗的情況。

代碼演示

下面,通過實際代碼,來演示對象序列化、反序列化的操作。

引入依賴

org.apache.commons commons-lang3 3.8.1commons-io commons-io 2.6junit junit 4.12

commons-lang3這個包有幫我們實現了序列化的工具類,commons-io幫我們實現了文件操作的工具類,junit用來寫單元測試。

序列化

有User.class如下:

@Data@Builderpublic class User implements Serializable {? private static final long serialVersionUID = 1L;? private String username;?}

@Data 和 @Builder 是Lombok里面的注解,可以自動生成getter、setter方法等,不懂的可以查看我之前的文章,對這個有講解。

需要序列化的類,需要實現Serializable接口,Serializable是一個標識接口,里面沒有具體需要實現的東西。

f45e2f39827be3bd5d4bedc8e274b355.png

序列化代碼:

@Testpublic void serializeTest() throws IOException { User user = User.builder().username("happyjava").build(); byte[] serialize = SerializationUtils.serialize(user); FileUtils.writeByteArrayToFile(new File("serialize.txt"), serialize);}

SerializationUtils是commons-lang3包給我們提供的工具類,它給我們提供了序列化和反序列化的方法,我們直接拿過來用就好了。

FileUtils是commons-io包給我們提供的工具類,它給我們提供了非常豐富的IO操作工具類。

執行方法后,查看serialize.txt:

0f2710a361c7b76c1d9580fe4a3bbe60.png

這就是序列化后,保存到外部的對象了。我們可以把它反序列化成為對象。

反序列化

反序列化代碼如下:

@Testpublic void deserializeTest() throws IOException { byte[] bytes = FileUtils.readFileToByteArray(new File("serialize.txt")); Object object = SerializationUtils.deserialize(bytes); System.out.println(object instanceof User); User user = (User)object; System.out.println(user.getUsername());}

這里使用FileUtils把外部的文件讀入,使用SerializationUtils反序列化成為對象。然后判斷反序列化后對象的類型,強轉為User后輸出其username,運行結果如下:

c0bb5764a8f0c785d8c9b6897a5cc2d7.png

說明反序列化已經成功過了

修改serialVersionUID值,使反序列化異常

現在把User的serialVersionUID值做一下修改:

@Data@Builderpublic class User implements Serializable {? private static final long serialVersionUID = 2L;? private String username;?}

之前是1,現在改為2,再次執行反序列化方法,結果如下:

515fe6767c32fb127f296dbc04ec0f8f.png

這里出現了開頭提到的InvalidClassException異常,并且通過異常信息可以看到,這是serialVersionUID不一致引起的。

org.apache.commons.lang3.SerializationException: java.io.InvalidClassException: cn.happy.User; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2

總結

通過理論和代碼演示,我們已經知道了serialVersionUID字段可以造成反序列化失敗的情況。所以在做系統升級的時候,需要充分考慮是否要改動serialVersionUID的值,因為這會引起兼容性的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

fatal error LNK1169: 找到一個或多個多重定義的符號 的解決方案

昨天&#xff0c;嘗試一個項目&#xff0c;遇到了如下的問題。先來還原一下&#xff1a; 頭文件test.h #pragma once #include <Eigen/Core> #include <iostream>using namespace Eigen; using namespace std;class point2 { public: point2(int x1,int y1):x(x…

常用工具說明--搭建基于rietveld的CodeReview平臺(未測試)

為什么要codereview . 整個團隊的編碼風格是統一的。 . 有高手能對自己的代碼指點一二&#xff0c;從而提高編碼水平。 . 減少低級錯誤的出現 . 約束自己寫高質量的代碼&#xff0c;因為是要給人看的。 我們對codereview的需求 . 很輕松可以發布自己寫的代碼。 . 很輕松的可以與…

輸入的優化

讀入整型時&#xff0c;輸入優化可以節省不少時間 1 typedef type long long 2 // 這里以long long為例 3 type read() { 4 type x0; int f1; 5 char chgetchar(); 6 while(ch<0||ch>9) {if(ch-) f-1; chgetchar();} 7 while(ch>0&&ch<9) …

python股票分析系統_熬了一晚上,小白用Python寫了一個股票提醒系統

碼農小馬七夕節去相親了&#xff0c;見了一個不錯的姑娘&#xff0c;長的非常甜美&#xff01;聊著聊著很投緣&#xff01;通過介紹人了解到&#xff0c;對方也很滿意&#xff5e;&#xff5e;想著自己單身多年的生活就要結束啦&#xff0c;心里滿是歡喜&#xff0c;美美噠&…

有關eigen庫的一些基本使用方法

目錄 介紹安裝Demo矩陣、向量初始化C數組和矩陣轉換矩陣基礎操作點積和叉積轉置、伴隨、行列式、逆矩陣計算特征值和特征向量解線性方程最小二乘求解稀疏矩陣介紹 Eigen是一個輕量級的矩陣庫,除了稀疏矩陣不成熟&#xff08;3.1有較大改進&#xff09;以外,其他的矩陣和向量操作…

匯編程序:將字符串中所有大寫字符轉為小寫

【任務】 編寫程序&#xff0c;將數據區中定義的以0作為結束符的一個字符串中所有的大寫字符&#xff0c;全部轉換為小寫。 【參考解答】 assume cs:cseg, ds:dseg, ss:sseg sseg segment stackdw 100h dup (?) sseg ends dseg segmentdb YanTai123University, 0 d…

從零開始編寫自己的C#框架(1)——前言

記得十五年前自學編程時&#xff0c;拿著C語言厚厚的書&#xff0c;想要上機都不知道要用什么編譯器來執行書中的例子。十二年前在大學自學ASP時&#xff0c;由于身邊沒有一位同學和朋友學習這種語言&#xff0c;也只能整天混在圖收館里拼命的啃書。而再后來也差不多&#xff0…

Bash內置命令

Bash有很多內置命令&#xff0c;因為這些命令是內置的&#xff0c;因此bash不需要在磁盤上為它們定位&#xff0c;執行速度更快。 1&#xff09;列出所有內置命令列表$enable 2&#xff09;關閉內置命令test$enable -n test 3&#xff09;打開內置命令test$enable test 4&…

postman調用webservice接口_接口對前后端和測試的意義

1.什么是接口&#xff1f;接口測試主要用于外部系統與系統之間以及內部各個子系統之間的交互點&#xff0c;定義特定的交互點&#xff0c;然后通過這些交互點來&#xff0c;通過一些特殊的規則也就是協議&#xff0c;來進行數據之間的交互。2.接口都有哪些類型&#xff1f;接口…

基于代數距離的橢圓擬合

問題 給定離散點集Xi(xi,yi),i1,2,...NX_i(x_i,y_i) ,i1,2,...NXi?(xi?,yi?),i1,2,...N&#xff0c;我們希望找到誤差最小的橢圓去擬合這些離散點。 方法 由于橢圓的形式可以給定&#xff0c; 自然我們將使用最小二乘法來求解橢圓。主要依據論文《Direct least squares f…

Java與C語言比較(Java參考書中摘錄)

C語言為面向過程的編程語言&#xff0c;Java為面向對象的編程語言。 在面向過程的編程語言(如C語言)中&#xff0c;編程一般面向操作&#xff0c;編程單位是函數(在Java中函數稱為方法)。 在Java中&#xff0c;編程單位是類。最終實例化(即創建)這些類而得到對象&#xff0c;屬…

Android調試技巧之Eclipse行號和Logcat

很多初入Android的開發者可能會發現經常遇到Force Close或ANR這樣的問題&#xff0c;一般我們通過Android系統的錯誤日志打印工具Logcat可以看到出錯的內容&#xff0c;今天一起來說下如何通過 Eclipse行號和Logcat捕捉出錯點&#xff0c;我們遇到錯誤可以首先在Eclipse的DDMS中…

第六章 產權市場

《市場經濟概論》&#xff08;6&#xff09;產權市場一 第六章 產權市場 產權是指人們對于某種資產所擁有的所有權、占有權、支配權、使用權。產權市場是指人們對于某種資產所擁有的所有權、占有權、支配權、使用權進行有償轉讓的場所領域及其有關各方面相互關系的總和。在過去…

js打開本地文件夾_vue + ArcGIS 地圖應用系列一:arcgis api本地部署(開發環境)

1. 下載 ArcGIS API for JavaScript 官網地址&#xff1a; https://developers.arcgis.com/javascript/3/ 下載地址&#xff1a;http://links.esri.com/javascript-api/latest-download需要穩定的網絡環境注冊賬號后才可以下載下載完成后解壓文件&#xff0c;文件比較大可能需要…

基于幾何距離的橢圓擬合

問題 給定離散點集Xi(xi,yi)X_i(x_i,y_i)Xi?(xi?,yi?)&#xff0c;我們希望找到最好的橢圓去擬合這些離散點。 方法 通常我們使用最小二乘法求解如下的最優化問題&#xff1a; Min∑i1Nf(xi,E)2Min \sum_{i1}^N f(x_i,E)^2 Mini1∑N?f(xi?,E)2 這里f(xi,E)f(x_i,E)f(xi…

Generate Parentheses

題目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 方法…

ReportViewer 2010 打印預覽,用鼠標快速切換顯示比例時報錯:存儲空間不足,不能處理此命令...

CreateCompatibleDIB 存儲空間不足 無法處理此命令 安裝 ReportViewer 2010 sp1 即可。轉載于:https://www.cnblogs.com/runliuv/p/3640856.html

貪心/二分查找 BestCoder Round #43 1002 pog loves szh II

題目傳送門 1 /*2 貪心/二分查找&#xff1a;首先對ai%p&#xff0c;然后sort&#xff0c;這樣的話就有序能使用二分查找。貪心的思想是每次找到一個aj使得和為p-1(如果有的話)3 當然有可能兩個數和超過p&#xff0c;那么an的值最優&#xff0c;每次還要和…

nohup命令輸出日志_逼格高又實用的Linux高級命令,開發運維都要懂

在運維的坑里摸爬滾打好幾年了&#xff0c;我還記得我剛開始的時候&#xff0c;我只會使用一些簡單的命令&#xff0c;寫腳本的時候&#xff0c;也是要多簡單有多簡單&#xff0c;所以有時候寫出來的腳本又長又臭&#xff0c;像一些高級點的命令&#xff0c;比如說Xargs 命令、…

JavaScript中OOP——面向對象中的繼承/閉包

前 言 OOP JavaScript中OOP——>>>面向對象中的繼承/閉包 1.1面向對象的概念 使用一個子類繼承另一個父類&#xff0c;子類可以自動擁有父類的屬性和方法。>>> 繼承的兩方&#xff0c;發生在兩個類之間。1.2JS模擬實現繼承的三種方式&#xff1a; 首先&am…