it-swarm.com.de

IntelliJ IDEA serialVersionUID generieren

Wie wird dieser Wert in IntelliJ IDEA generiert?

Ich gehe zu Einstellungen -> Fehler -> Serialisierungsprobleme -> Serialisierbare Klasse ohne 'serialVersionUID', aber es zeigt mir immer noch nicht die Warnung. Meine Klasse übergeordnetes PKladrBuilding implementiert Schnittstelle serialisierbar.

Teil des Codes:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable
276
Kirill Bazarov

Ich bin mir nicht sicher, ob Sie eine alte Version von IntelliJ IDEA haben, gehe aber zum Menü DateiEinstellungen ...InspektionenSerialisierungsprobleme → Serialisierbare Klasse ohne 'serialVersionUID', die von Ihnen angegebene Klasse warnt mich.

Enter image description here

Wenn ich die erste Klasse probiere, sehe ich:

Enter image description here

Übrigens: Es zeigte mir keine Warnung, bis ich { } bis zum Ende jeder Klasse, um den Kompilierungsfehler zu beheben.

551
Peter Lawrey

Installieren Sie das Plugin GenerateSerialVersionUID von Olivier Descout.

Gehen Sie zu: Menü Datei Einstellungen Plugins Repositorys durchsuchenGenerateSerialVersionUID

Installieren Sie das Plugin und starten Sie es neu.

Jetzt können Sie die ID aus dem Menü Code Generieren → serialVersionUID` oder der Verknüpfung generieren.

161
Sileria

Ohne Plugins: Sie müssen nur die Hervorhebung in IntelliJ aktivieren:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' - Flag setzen und auf 'OK' Klicken.

Wenn Ihre Klasse nun Serializable implementiert, wird hervorgehoben, und alt+Enter Für den Klassennamen schlägt vor, private static final long serialVersionUID Zu generieren.

PS: Aus hier

57
Nikhil Katre

Nachdem wir einige Zeit mit Serialisierung verbracht haben, sollten wir serialVersionUID nicht mit einem zufälligen Wert generieren, sondern ihm einen aussagekräftigen Wert geben.

Hier ist ein Detailkommentar dazu. Ich kopiere den Kommentar hier.

Eigentlich sollten Sie keine Serienversions-UIDs "generieren". Es ist eine blöde "Funktion", die sich aus dem allgemeinen Missverständnis ergibt, wie diese ID von Java verwendet wird. Sie sollten diesen IDs aussagekräftige, lesbare Werte geben, z. Beginnen Sie mit 1L und erhöhen Sie sie jedes Mal, wenn Sie der Meinung sind, dass die neue Version der Klasse alle früheren Versionen (die möglicherweise zuvor serialisiert wurden) veralten lassen sollte. Alle Dienstprogramme, die solche IDs generieren, tun im Wesentlichen das, was die JVM tut, wenn die ID nicht definiert ist: Sie generieren den Wert basierend auf dem Inhalt der Klassendatei, sodass nicht lesbare, bedeutungslose, lange Ganzzahlen entstehen. Wenn Sie möchten, dass sich jede einzelne Version Ihrer Klasse unterscheidet (in den Augen der JVM), sollten Sie nicht einmal den Wert serialVersionUID angeben, da die JVM im laufenden Betrieb einen Wert erzeugt, und der Wert jeder Version Ihrer Klasse einzigartig sein. Der Zweck der expliziten Definition dieses Werts besteht darin, dem Serialisierungsmechanismus mitzuteilen, dass verschiedene Versionen der Klasse mit derselben SVUID behandelt werden sollen, als ob sie gleich wären, z. die älteren serialisierten Versionen nicht abzulehnen. Wenn Sie also die ID definieren und nie ändern (und ich nehme an, dass Sie dies tun, da Sie sich auf die automatische Generierung verlassen und Ihre IDs wahrscheinlich nie neu generieren), stellen Sie sicher, dass alle - auch absolut unterschiedlichen - Versionen von Ihre Klasse wird vom Serialisierungsmechanismus als dieselbe betrachtet. Ist es das was du willst? Wenn dies nicht der Fall ist und Sie tatsächlich die Kontrolle darüber haben möchten, wie Ihre Objekte erkannt werden, sollten Sie einfache Werte verwenden, die Sie selbst verstehen und leicht aktualisieren können, wenn Sie feststellen, dass sich die Klasse erheblich geändert hat. Ein 23-stelliger Wert hilft überhaupt nicht.

Hoffe das hilft. Viel Glück.

35
Emdadul Sawon

Um den Wert zu generieren, verwenden Sie

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

und geben Sie für die Template-Variable randomLong den folgenden Wert an: groovyScript ("new Random (). nextLong (). abs ()")

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

16
pharsfalvi

Außerdem können Sie eine Live-Vorlage hinzufügen, die die Arbeit erledigt.

Drücken Sie dazu Ctrl+Alt+S -> "Live Templates" section -> other (oder w/w, was Sie wünschen)

Und dann erstelle eine neue mit einer Definition wie dieser:

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

Wählen Sie dann den Bereich definition und speichern Sie ihn als 'serial'

Jetzt können Sie serial eingebenTAB in der Klasse Körper.

13
fallens4e

Mit Version v2018.2.1

Gehe zu

Preference> Editor> Inspections> Java> Serialization issues> "Serializable class without 'serialVersionUID'" umschalten.

Neben der Klassendeklaration sollte eine Warnung angezeigt werden.

2
YLyu

Fügen Sie der anderen Gruppe eine Live-Vorlage mit dem Namen "ser" hinzu, setzen Sie sie auf "Anwendbar in Java: Deklaration" und deaktivieren Sie "Shorten FQ names". Geben Sie einen Vorlagentext von nur:

$serial$

Bearbeiten Sie nun die Variablen und setzen Sie serial auf:

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())

Es wird das Standardlayout für Gradle-Projekte verwendet. Ändere/build/nach/target/für Maven.

1
Greg Allen

Ich verwende Android Studio 2.1 und habe eine bessere Konsistenz beim Erhalten der Glühbirne, indem ich auf den Klassennamen klicke und für eine Sekunde darüber schwebe.

1
Johnny Wu

Eine andere Möglichkeit, die serialVersionUID zu generieren, ist die Verwendung von >Analyze >Run Inspection by Name aus dem Kontextmenü (oder über die Tastenkombination <Ctrl>+<Shift>+<Alt>+I standardmäßig) und geben Sie dann "Serializable class without 'serialVersionUID'" ein (oder geben Sie einfach "serialVersionUID" ein, und die Funktion "type ahead" findet sie für Sie.

Idea >Analyze >Run Inspection by Name Sie erhalten dann ein Kontextmenü, in dem Sie auswählen können, wo die Inspektionen ausgeführt werden sollen (z. B. alle aus einem bestimmten Modul, einem gesamten Projekt, einer Datei usw.).

Bei diesem Ansatz müssen Sie nicht einmal die allgemeinen Inspektionsregeln festlegen.

1
Alexander

Wenn Sie die fehlende serialVersionUID für eine Reihe von Dateien hinzufügen möchten, funktioniert IntelliJ IDEA möglicherweise nicht sehr gut. Ich habe ein einfaches Skript entwickelt, um dieses Ziel mühelos zu erreichen:

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

Sie speichern dieses Skript, sagen wir als add_serialVersionUID.sh in deinem ~/bin Mappe. Dann führen Sie es im Stammverzeichnis Ihres Maven- oder Gradle-Projekts wie folgt aus:

add_serialVersionUID.sh < myJavaToAmend.lst

Diese .lst enthält die Liste von Java Dateien zum Hinzufügen der serialVersionUID im folgenden Format:

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

Dieses Skript verwendet das JDK-Tool serialVer. Es ist ideal für eine Situation, in der Sie eine große Anzahl von Klassen ändern möchten, für die keine serialVersionUID festgelegt wurde, während die Kompatibilität mit den alten Klassen erhalten bleibt.

0
schnell18