java - intellij generate serialversionuid shortcut




IntelliJ Idea generiert serialVersionUID (6)

Meine Frage ist, wie man diesen Wert in IDEA erzeugt? Ich gehe zu Einstellungen -> Fehler -> Serialisierungsprobleme -> Serialisierbare Klasse ohne 'serialVersionUID', aber es zeigt mir immer noch nicht die Warnung. Meine Klasse PKladrBuilding Eltern implementiert Schnittstelle Serializable .

Teil des Codes:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

Fügen Sie der anderen Gruppe eine Live-Vorlage namens "ser" hinzu, setzen Sie sie auf "Anwendbar in Java: Deklaration" und deaktivieren Sie "FQ-Namen kürzen". Gib es Template Text von nur

$serial$

Bearbeiten Sie nun 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())

Übernimmt das Standard-Großprojektlayout. Ändern / bauen / nach / Ziel / für Maven.


Ich benutze Android Studio 2.1 und ich habe eine bessere Konsistenz, um die Glühbirne zu bekommen, indem ich auf den Namen der Klasse klicke und eine Sekunde darüber schwebe.


Installieren Sie das GenerateSerialVersionUID Plugin von Olivier Descout

Gehe zu: File > Settings > Plugins > Browse repositories > GenerateSerialVersionUID

Installiere das Plugin und starte es neu.

Jetzt können Sie die ID aus Code > Generate > serialVersionUID oder der Verknüpfung Code > Generate > serialVersionUID .


Nachdem ich einige Zeit mit der Serialisierung verbracht habe, finde ich, dass wir serialVersionUID mit einem zufälligen Wert erzeugen sollten, sondern einen sinnvollen Wert serialVersionUID .

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

Eigentlich sollten Sie keine seriellen UIDs erzeugen. Es ist ein dummes "Feature", das von dem allgemeinen Missverständnis herrührt, wie diese ID von Java verwendet wird. Sie sollten diesen IDs sinnvolle, lesbare Werte geben, z. B. beginnend mit 1L, und sie jedes Mal erhöhen, wenn Sie der Meinung sind, dass die neue Version der Klasse alle früheren Versionen (die möglicherweise vorher serialisiert wurden) veraltet macht. Alle Dienstprogramme, die solche IDs erzeugen, tun im Grunde, was die JVM tut, wenn die ID nicht definiert ist: Sie erzeugen den Wert basierend auf dem Inhalt der Klassendatei und kommen daher mit nicht lesbaren bedeutungslosen langen ganzen Zahlen. Wenn Sie möchten, dass jede Version Ihrer Klasse eindeutig ist (in den Augen der JVM), sollten Sie nicht einmal den serialVersionUID-Wert angeben, da die JVM einen on-the-fly erzeugt und den 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 identisch wären, z. B. um die älteren serialisierten Versionen nicht abzulehnen. Also, wenn Sie die ID definieren und nie ändern (und ich nehme an, dass Sie das tun, da Sie sich auf die automatische Generierung verlassen und Ihre IDs wahrscheinlich nie wieder generieren), stellen Sie sicher, dass alle - auch absolut unterschiedliche - Versionen von Ihre Klasse wird vom Serialisierungsmechanismus als gleich angesehen. Ist es das was du willst? Wenn nicht, und wenn 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 sich entscheiden, dass sich die Klasse signifikant geändert hat. Ein 23-stelliger Wert hilft überhaupt nicht.

Hoffe das hilft. Viel Glück.



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, um dieses Ziel mit Leichtigkeit 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 das Skript, sagen Sie add_serialVersionUID.sh zu Ihnen ~ / bin. Dann führen Sie es im Stammverzeichnis Ihres Maven- oder Gradle-Projekts aus:

add_serialVersionUID.sh < myJavaToAmend.lst

Diese .lst enthält die Liste der 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-serialVer-Tool. Es ist ideal für Situationen, in denen 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 beibehalten wird.





intellij-idea