IntelliJ IDEAでこの値をどのように生成しますか?
設定 - >エラー - >シリアル化の問題 - >シリアル化可能'serialVersionUID'のないクラスですが、それでも警告が表示されません。私のクラスPKladrBuildingの親はインターフェースSerializableを実装しています。
コードの一部
public class PKladrBuilding extends PRQObject
public abstract class PRQObject extends PObject
public abstract class PObject implements Serializable
IntelliJ IDEAの古いバージョンがあるかどうかはわかりませんが、メニューに移動するとファイル→設定... →検査→直列化の問題→ 'serialVersionUID'が有効になっていない直列化可能クラス、あなたが提供するクラスは私に警告を与えます。
私は最初のクラスを試してみると私は見る:
ところで:私はコンパイルエラーを修正するために各クラスの最後に{ }
を追加するまでそれは私に警告を表示しませんでした。
Olivier DescoutによるGenerateSerialVersionUIDプラグインをインストールします。
移動メニュー:[ファイル→設定→プラグイン→参照リポジトリ→GenerateSerialVersionUID
プラグインをインストールして再起動してください。
メニューコード→生成→serialVersionUID`またはショートカットからIDを生成できます。
プラグインなし:IntelliJでハイライトを有効にするだけです。
IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'
- フラグを設定して'OK'
をクリックします。
さて、あなたのクラスがSerializable
を実装するならば、あなたはハイライトを見るでしょう、そしてクラス名のalt+Enter
はprivate static final long serialVersionUID
を生成することを提案するでしょう。
シモンズ: ここから撮影
シリアライゼーションにしばらく時間をかけた後、ランダムな値でserialVersionUID
を生成するべきではなく、意味のある値を与えるべきです。
これについての詳細なコメントはこちらです ここでコメントに対処しています。
実際には、シリアルバージョンのUIDを「生成」してはいけません。これは、そのIDがJavaによってどのように使用されているかについての一般的な誤解に由来する愚かな「機能」です。あなたはこれらのIDに意味のある、読みやすい値を与えるべきです。 1Lから始めて、新しいバージョンのクラスがすべての以前のバージョン(以前はシリアル化されている可能性がある)を時代遅れにする必要があると思うたびにそれらを増分します。このようなIDを生成するすべてのユーティリティは、IDが定義されていないときに基本的にJVMが実行することを行います。つまり、クラスファイルの内容に基づいて値を生成します。 (JVMから見て)クラスのすべてのバージョンを区別したい場合は、JVMがその場でシリアルバージョンを生成するようにserialVersionUIDの値を指定しないでください。一意であること。その値を明示的に定義する目的は、同じSVUIDを持つクラスの異なるバージョンをあたかもそれらが同じであるかのように扱うようシリアライゼーションメカニズムに伝えることです。古い直列化バージョンを拒否しないようにします。そのため、IDを定義して変更しない場合(そして自動生成に依存しているためIDを再生成しないため、これを実行するのではないかと思います)、あなたのクラスはシリアライゼーションメカニズムによって同じと見なされます。それはあなたが欲しいものですか?そうでない場合、そして実際にオブジェクトの認識方法を制御したい場合は、クラスが大幅に変更されたと判断したときに理解しやすい簡単な値を使用する必要があります。 23桁の値を設定してもまったく役に立ちません。
お役に立てれば。がんばろう。
値を生成するために
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/
さらに、あなたは仕事をするライブテンプレートを追加することができます。
それを行うには Ctrl+Alt+S - > "Live Templates"
セクション - > other
(またはあなたが望むw/e)
そして、このような定義で新しいものを作成します。
private static final long serialVersionUID = 1L;
$END$
次にdefinition
スコープを選択して'serial'
として保存します
これでserial
と入力できますTAB クラス本体で。
バージョンv2018.2.1
に行く
設定>エディタ>検査> Java>直列化の問題>「serialVersionUIDなしの直列化可能クラス」を切り替えます.
クラス宣言の横に警告が表示されます。
他のグループに "ser"というライブテンプレートを追加し、それを "Applicable in Java:declaration"に設定し、 "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 /に変更します。
私はAndroid Studio 2.1を使用しています。クラスNameをクリックしてマウスを置くと、電球を取得する際の一貫性が向上します。
たくさんのファイルに存在しない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が設定されていない膨大な数のクラスを修正したい場合に最適です。
SerialVersionUIDを生成するもう1つの方法は、コンテキストメニュー(またはデフォルトでは>Analyze >Run Inspection by Name
であるキーボードショートカット)から<Ctrl>+<Shift>+<Alt>+I
を使用し、次に「serialVersionUIDなしの直列化可能クラス」と入力するか(または単に「serialVersionUID」と入力し、先行入力機能を使用する)あなたのためにそれを見つけるでしょう。
その後、検査を実行する場所を選択できるコンテキストメニューが表示されます(たとえば、特定のモジュールからのすべて、プロジェクト全体、1つのファイルなど)。
この方法では、一般的な検査規則を何にも設定する必要はありません。