314

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

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

コードの一部:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable
4

12 に答える 12

615

古いバージョンのIntelliJIDEAを使用しているかどうかはわかりませんが、メニューの[ファイル] → [設定...] → [検査] → [シリアル化の問題]→[ serialVersionUID]`が有効になっていないシリアル化可能なクラスに移動すると、指定したクラスから警告が表示されます。

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

私が最初のクラスを試してみると、次のようになります。

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

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

于 2012-10-16T10:17:06.227 に答える
179

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

メニューファイル設定プラグインリポジトリの参照→に移動します。GenerateSerialVersionUID

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

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

于 2013-08-20T17:29:28.040 に答える
78

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

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

これで、クラスがを実装Serializableしている場合、ハイライトが表示され、alt+Enterクラス名での生成が提案されprivate static final long serialVersionUIDます。

PS:ここから撮影

于 2017-03-15T05:29:11.273 に答える
40

シリアル化に時間を費やした後、serialVersionUIDランダムな値で生成するのではなく、意味のある値を与える必要があることがわかりました。

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

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

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

于 2017-07-16T04:53:39.743 に答える
17

値を生成するには、

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/

于 2015-03-18T10:01:06.527 に答える
14

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

これを行うには、Ctrl+Alt+S->"Live Templates"セクション-> other(または必要に応じて)を押します

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

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

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

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

于 2014-09-18T11:59:42.967 に答える
11

最も簡単な最新の方法:Alt+ Enteron

private static final long serialVersionUID = ;

IntelliJは、の後にスペースに下線を付け=ます。その上にカーソルを置き、alt+ Enter(Macの場合は+)を押しますOptionEnter「serialVersionUIDInitializerをランダムに変更する」というポップオーバーが表示されます。Enterキーを押すだけで、そのスペースにランダムな長さが表示されます。

于 2020-05-06T17:46:07.860 に答える
4

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

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

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

于 2019-06-14T07:55:48.427 に答える
2

バージョン付きv2018.2.1

に移動

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

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

于 2018-10-18T01:45:27.420 に答える
1

多数のファイルに存在しないserialVersionUIDを追加する場合、IntelliJIDEAはうまく機能しない可能性があります。この目標を簡単に達成するための簡単なスクリプトをいくつか思いつきます。

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

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

于 2015-06-27T12:19:39.790 に答える
1

私はAndroidStudio2.1を使用していますが、クラス名をクリックして1秒間カーソルを合わせると、電球を取得する際の一貫性が向上します。

于 2016-06-27T04:10:25.383 に答える
1

「ser」というライブテンプレートを他のグループに追加し、「Applicable in Java:d​​eclaration」に設定して、「ShortenFQnames」のチェックを外します。ちょうど次のテンプレートテキストを与えます:

$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/に変更します。

于 2017-02-08T13:01:07.153 に答える