IntelliJ IDEAがserialVersionUIDを生成


297

IntelliJ IDEAでこの値を生成するにはどうすればよいですか?

私は行く設定 - > [ エラー - > シリアライズの問題 - 「serialVersionUIDの」なし>直列化可能クラスが、それはまだ私に警告を表示しません。私のクラスPKladrBuilding親はSerializableインターフェースを実装しています

コードの一部:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
自分で値を定義するのではなく、値を生成する必要がありますか?新しいクラスを作成している場合は、たとえば1LIDとして定義し、シリアル化されたフォームが変更されたときに増分することをお勧めします。(stackoverflow.com/questions/888335/…を参照)。
Duncan Jones、

1
stackoverflow.com/questions/24573643/…には非常に優れたソリューションがあります。
Pankaj Kumar 2016

回答:


588

あなたがのIntelliJ IDEAの古いバージョンを持っている場合、私はわからないが、私はメニューに行けば、ファイル設定...検査シリアル化の問題「serialVersionUID'`なし→直列化クラスが有効になって、あなたが提供するクラスは、私に警告を与えます。

ここに画像の説明を入力してください

私が目にする最初のクラスを試してみると:

ここに画像の説明を入力してください

ところで{ }、コンパイルエラーを修正するために各クラスの最後に追加するまで、警告は表示されませんでした。


2
お試しくださいFile| Invalidate Caches解決しない場合は、再現するサンプルプロジェクトをsupport@jetbrains.comまでお問い合わせください。
CrazyCoder 2012年

1
idea.log例外がないか(ヘルプ|ログインを表示...)を確認してください。Linuxの暗号化されたホームディレクトリは、カーネルのバグが原因で問題が発生することがわかっています
CrazyCoder 2012年

1
私はそこに多くの例外があります。java.lang.NoClassDefFoundErrorのような:org / intellij / lang / annotations / MagicConstant;
Kirill Bazarov、

2
IDEAを再インストールし、プラグインを削除しました。Tnxたくさん。
Kirill Bazarov

5
v15で機能させるには、ClassNameにカーソルを合わせて警告を確認し、マウスを溝に向かってゆっくりと動かします。その時点で、「電球」が画面に表示されます。(最初に意図したとおりに機能しない場合は、これを数回試してください)。次に、フィールド作成オプションをクリックして、uidを作成できます。これがこれで行き詰まっている人々を助けることを願っています。
Niyaz

173

Olivier DescoutのGenerateSerialVersionUIDプラグインをインストールします。

移動:メニューファイル設定プラグインリポジトリの参照GenerateSerialVersionUID

プラグインをインストールして再起動します。

これで、メニューコード生成 →serialVersionUID`またはショートカットからIDを生成できます。


14
これを機能させるために、実際には外部プラグインが必要ですか?
H.Rabiee 2014年

はい、すでにIntelliJプラグインリポジトリの一部であるプラグインが必要です。
Sileria 2014年

Intellij IDEA 12.1で私のために働いた
Sagar Hatekar 14

13.0.2で動作します。
user1978019 2014

Android Studio 0.8.9で動作します
Itai Hanski

67

プラグインなし:IntelliJでハイライトを有効にする必要があります:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'-フラグを設定してをクリックします'OK'

これで、クラスがを実装するとSerializable、ハイライトが表示され、alt+Enterクラス名にを生成するよう提案されprivate static final long serialVersionUIDます。

PS:ここから撮影


4
ありがとう。なぜ電球が表示されないのかはわかりませんが、クラス名をクリックしてAlt-Enterキーを押すとうまくいきます。
John S


これはより最新のものです
クリスチャンマシュー

39

シリアライゼーションに少し時間を費やした後、serialVersionUIDランダムな値で生成するのではなく、意味のある値を与える必要があることに気づきました。

これについての詳細なコメントはここにあります。ここでコメントに対応します。

実際、シリアルバージョンのUIDを「生成」することはできません。これは、そのIDがJavaでどのように使用されるかについての一般的な誤解に由来する、ばかげた「機能」です。これらのIDには、1Lから開始するなど、意味のある読みやすい値を指定し、クラスの新しいバージョンが以前のすべてのバージョン(以前にシリアル化された可能性がある)を廃止する必要があると考えるたびに、値を増やします。そのようなIDを生成するすべてのユーティリティは、基本的にはIDが定義されていない場合にJVMが行うことを実行します。それらはクラスファイルの内容に基づいて値を生成するため、判読できない意味のない長整数になります。(JVMの観点から)クラスのすべてのバージョンを個別にしたい場合は、JVMがオンザフライで生成するため、serialVersionUID値を指定しないでください。クラスの各バージョンの値は一意になります。その値を明示的に定義する目的は、同じSVUIDを持つクラスの異なるバージョンを同じものとして扱うようにシリアル化メカニズムに指示することです。たとえば、古いシリアル化バージョンを拒否しないようにします。したがって、IDを定義してそれを変更しない場合(自動生成に依存しているため、そうするのは当然であり、IDを再生成しない可能性があります)、すべてのバージョン(絶対に異なるものも含む)を確実にクラスは、シリアル化メカニズムによって同じと見なされます。それでいいの?そうでない場合で、実際にオブジェクトの認識方法を制御したい場合は、クラスが大幅に変更されたと判断したときに、自分で理解でき、簡単に更新できる単純な値を使用する必要があります。

お役に立てれば。幸運を。


2
おかげで、私はこの単純な事実を長い間スキップしていました!
dedek 2017年

1
serialVersionUID逆シリアル化で古いバージョンをサポートしたくない場合は、実際に新しい乱数でを再生成します。多分私は乱数を使う必要はありませんが、1から始めて、それをインクリメントできます。しかし、3L私にはそれ以上の意味はありません-3518231192373568183L。したがって、どちらのソリューションも同様に機能すると思います。ただし、この乱数には、分岐と分岐のある非線形履歴で問題が発生するという利点があります。
JojOatXGME

16

価値を生み出すために

private static final long serialVersionUID = $randomLong$L;
$END$

そして、randomLongテンプレート変数に次の値を指定します:groovyScript( "new Random()。nextLong()。abs()")

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/


1
このコメントが大好きです。ライブテンプレートを使用すると、これは確かに最速のソリューションであり、最もカスタマイズ可能です(たとえば、改行を削除しました)。設定するには、Android Studio> Preferences> Editor> Live Templatesに移動し、そこに新しい値(プラスアイコン)をこの値で作成し、編集変数を使用してスクリプトを入力します
hcpl

13

さらに、作業を行うライブテンプレートを追加できます。

それを行うにはCtrl+Alt+S-> "Live Templates"セクション-> other(またはw / eを押して)を押します

そして、次のような定義で新しいものを作成します。

private static final long serialVersionUID = 1L;
$END$

次に、definitionスコープを選択して名前を付けて保存します'serial'

これserialTABで、クラスの本文を入力できます。


3

serialVersionUIDを生成する別の方法は>Analyze >Run Inspection by Name、コンテキストメニュー(またはキーボードのショートカット、デフォルトではctrl+ alt+ shift+ i)から使用し、「Serializable class without 'serialVersionUID'」(または単に「serialVersionUID」と入力し、先にタイプを入力することです関数がそれを見つけてくれます。

アイデア>分析>名前で検査を実行 次に、検査を実行する場所を選択できるコンテキストメニューが表示されます(たとえば、特定のモジュールからすべて、プロジェクト全体、1つのファイルなど)。

このアプローチでは、一般的な検査ルールを何に設定する必要すらありません。


これでうまくいきました。不足している変数を見つけ、それを追加するオプションを提示しました。
arenaq

@arenaq嬉しい、これは他の誰かを助けました;-)
Alexander

2

バージョン付き v2018.2.1

に行く

設定>エディター>インスペクション> Java>シリアライゼーションの問題>「 'serialVersionUID'のないシリアル化可能クラス」を切り替えます。

クラス宣言の横に警告が表示されます。


1

私はAndroid Studio 2.1を使用していますが、クラス名をクリックして1秒間マウスをホバーすることで電球を取得する一貫性が向上しました。


1

「ser」というライブテンプレートを他のグループに追加し、「Javaでの適用:宣言」に設定して、「短縮FQ名」のチェックを外します。次のテンプレートテキストを提供します。

$serial$

次に、変数を編集し、シリアルを次のように設定します。

groovyScript("(System.env.JDK_HOME+'/bin/serialver -classpath '+com.intellij.openapi.fileEditor.FileDocumentManager.instance.getFile(_editor.document).path.replaceAll('/java/.*','').replaceAll('/src/','/build/classes/')+' '+_1).execute().text.replaceAll('.*: *','')",qualifiedClassName())

標準のGradleプロジェクトレイアウトを想定しています。Mavenの/ build /を/ target /に変更します。


1

最も簡単な最新の方法:Alt+ Enterオン

private static final long serialVersionUID = ;

IntelliJは=。の後のスペースに下線を引きます。その上にカーソルを置いてalt+ Enter(MacではOption+)Enterを押します。「シリアルバージョンUIDイニシャライザをランダムに変更」というポップオーバーが表示されます。Enterキーを押すだけで、ランダムにlongがそのスペースに追加されます。


0

一連のファイルに欠落しているserialVersionUIDを追加する場合、IntelliJ IDEAはうまく機能しない可能性があります。この目標を簡単に達成するための簡単なスクリプトを考え出します。

base_dir=$(pwd)
src_dir=$base_dir/src/main/java
ic_api_cp=$base_dir/target/classes

while read f
do
    clazz=${f//\//.}
    clazz=${clazz/%.java/}
    seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
    perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

あなたはと言う、このスクリプトを保存しadd_serialVersionUID.sh、あなたの中~/binのフォルダ。次に、次のようにMavenまたはGradleプロジェクトのルートディレクトリで実行します。

add_serialVersionUID.sh < myJavaToAmend.lst

この.lstには、serialVersionUIDを追加するJavaファイルのリストが次の形式で含まれています。

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

このスクリプトは、JDK serialVerツールを使用します。古いクラスとの互換性を維持しながら、serialVersionUIDが設定されていない膨大な数のクラスを修正したい場合に最適です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.