web-dev-qa-db-ja.com

IntelliJ IDEA serialVersionUIDを生成しています

IntelliJ IDEAでこの値をどのように生成しますか?

設定 - >エラー - >シリアル化の問題 - >シリアル化可能'serialVersionUID'のないクラスですが、それでも警告が表示されません。私のクラスPKladrBuildingの親はインターフェースSerializableを実装しています。

コードの一部

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable
270
Kirill Bazarov

IntelliJ IDEAの古いバージョンがあるかどうかはわかりませんが、メニューに移動するとファイル設定...検査直列化の問題→ 'serialVersionUID'が有効になっていない直列化可能クラス、あなたが提供するクラスは私に警告を与えます。

Enter image description here

私は最初のクラスを試してみると私は見る:

Enter image description here

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

546
Peter Lawrey

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

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

プラグインをインストールして再起動してください。

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

156
Sileria

プラグインなし:IntelliJでハイライトを有効にするだけです。

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

さて、あなたのクラスがSerializableを実装するならば、あなたはハイライトを見るでしょう、そしてクラス名のalt+Enterprivate static final long serialVersionUIDを生成することを提案するでしょう。

シモンズ: ここから撮影

53
Nikhil Katre

シリアライゼーションにしばらく時間をかけた後、ランダムな値でserialVersionUIDを生成するべきではなく、意味のある値を与えるべきです。

これについての詳細なコメントはこちらです ここでコメントに対処しています。

実際には、シリアルバージョンのUIDを「生成」してはいけません。これは、そのIDがJavaによってどのように使用されているかについての一般的な誤解に由来する愚かな「機能」です。あなたはこれらのIDに意味のある、読みやすい値を与えるべきです。 1Lから始めて、新しいバージョンのクラスがすべての以前のバージョン(以前はシリアル化されている可能性がある)を時代遅れにする必要があると思うたびにそれらを増分します。このようなIDを生成するすべてのユーティリティは、IDが定義されていないときに基本的にJVMが実行することを行います。つまり、クラスファイルの内容に基づいて値を生成します。 (JVMから見て)クラスのすべてのバージョンを区別したい場合は、JVMがその場でシリアルバージョンを生成するようにserialVersionUIDの値を指定しないでください。一意であること。その値を明示的に定義する目的は、同じSVUIDを持つクラスの異なるバージョンをあたかもそれらが同じであるかのように扱うようシリアライゼーションメカニズムに伝えることです。古い直列化バージョンを拒否しないようにします。そのため、IDを定義して変更しない場合(そして自動生成に依存しているためIDを再生成しないため、これを実行するのではないかと思います)、あなたのクラスはシリアライゼーションメカニズムによって同じと見なされます。それはあなたが欲しいものですか?そうでない場合、そして実際にオブジェクトの認識方法を制御したい場合は、クラスが大幅に変更されたと判断したときに理解しやすい簡単な値を使用する必要があります。 23桁の値を設定してもまったく役に立ちません。

お役に立てれば。がんばろう。

34
Emdadul Sawon

値を生成するために

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/

16
pharsfalvi

さらに、あなたは仕事をするライブテンプレートを追加することができます。

それを行うには Ctrl+Alt+S - > "Live Templates"セクション - > other(またはあなたが望むw/e)

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

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

次にdefinitionスコープを選択して'serial'として保存します

これでserialと入力できますTAB クラス本体で。

13
fallens4e

バージョンv2018.2.1

に行く

設定>エディタ>検査> Java>直列化の問題>「serialVersionUIDなしの直列化可能クラス」を切り替えます.

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

2
YLyu

他のグループに "ser"というライブテンプレートを追加し、それを "Applicable in Java:d​​eclaration"に設定し、 "Shorten FQ names"のチェックを外します。ちょうどそれのテンプレートテキストを付けます:

$serial$

変数を編集して、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
Greg Allen

私はAndroid Studio 2.1を使用しています。クラスNameをクリックしてマウスを置くと、電球を取得する際の一貫性が向上します。

1
Johnny Wu

たくさんのファイルに存在しない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が設定されていない膨大な数のクラスを修正したい場合に最適です。

0
schnell18

SerialVersionUIDを生成するもう1つの方法は、コンテキストメニュー(またはデフォルトでは>Analyze >Run Inspection by Nameであるキーボードショートカット)から<Ctrl>+<Shift>+<Alt>+Iを使用し、次に「serialVersionUIDなしの直列化可能クラス」と入力するか(または単に「serialVersionUID」と入力し、先行入力機能を使用する)あなたのためにそれを見つけるでしょう。

Idea >Analyze >Run Inspection by Name その後、検査を実行する場所を選択できるコンテキストメニューが表示されます(たとえば、特定のモジュールからのすべて、プロジェクト全体、1つのファイルなど)。

この方法では、一般的な検査規則を何にも設定する必要はありません。

0
Alexander