Wie wird dieser Wert in IntelliJ IDEA generiert?
Ich gehe zu Einstellungen -> Fehler -> Serialisierungsprobleme -> Serialisierbare Klasse ohne 'serialVersionUID', aber die Warnung wird mir immer noch nicht angezeigt. Meine übergeordnete Klasse PKladrBuilding implementiert die Schnittstelle Serializable .
Teil des Codes:
public class PKladrBuilding extends PRQObject
public abstract class PRQObject extends PObject
public abstract class PObject implements Serializable
java
serialization
intellij-idea
Kirill Bazarov
quelle
quelle
1L
B. Ihre ID definieren und inkrementieren, wenn sich Ihr serialisiertes Formular ändert. (Siehe stackoverflow.com/questions/888335/… ).Antworten:
Ich bin nicht sicher, ob Sie eine alte Version von IntelliJ IDEA haben, aber wenn ich zum Menü Datei → Einstellungen ... → Inspektionen → Serialisierungsprobleme → Serialisierbare Klasse ohne aktivierte 'serialVersionUID'` gehe, gibt die von Ihnen bereitgestellte Klasse Warnungen aus.
Wenn ich die erste Klasse versuche, sehe ich:
Übrigens: Es wurde mir keine Warnung angezeigt, bis ich
{ }
am Ende jeder Klasse hinzugefügt habe , um den Kompilierungsfehler zu beheben.quelle
File
|Invalidate Caches
Wenn dies nicht hilft, wenden Sie sich mit einem Beispielprojekt an [email protected], um es zu reproduzieren.idea.log
(Hilfe | Anmelden anzeigen ...) auf Ausnahmen. Es ist bekannt, dass das verschlüsselte Home-Verzeichnis unter Linux aufgrund des Kernel-Fehlers Probleme verursacht .Installieren Sie das GenerateSerialVersionUID- Plugin von Olivier Descout.
Gehen Sie zu: Menü Datei → Einstellungen → Plugins → Repositorys durchsuchen →
GenerateSerialVersionUID
Installieren Sie das Plugin und starten Sie es neu.
Jetzt können Sie die ID aus dem Menü Code → generieren Generieren → serialVersionUID` oder die Verknüpfung generieren .
quelle
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 klicken'OK'
.Wenn Ihre Klasse jetzt implementiert wird
Serializable
, wird eine Hervorhebung angezeigt, und deralt+Enter
Klassenname schlägt die Generierung vorprivate static final long serialVersionUID
.PS: Von hier genommen
quelle
Nachdem ich einige Zeit mit Serialisierung verbracht habe, finde ich, dass wir nicht
serialVersionUID
mit einem zufälligen Wert generieren sollten, sondern ihm einen aussagekräftigen Wert geben sollten.Hier ist ein Detailkommentar dazu. Ich bewältige den Kommentar hier.
Hoffe das hilft. Viel Glück.
quelle
serialVersionUID
mit einer neuen Zufallszahl neu generieren, wenn ich alte Versionen bei der Deserialisierung nicht unterstützen möchte. Vielleicht muss ich keine Zufallszahlen verwenden, sondern kann mit 1 beginnen und diese erhöhen. Allerdings hat3L
das für mich dann keine größere Bedeutung-3518231192373568183L
. Daher denke ich, dass beide Lösungen ähnlich funktionieren. Die Zufallszahl könnte jedoch den Vorteil haben, dass sie auf nichtlinearen Historien mit Gabeln und Zweigen funktioniert.Um den Wert zu generieren, verwenden Sie
und geben Sie der randomLong-Vorlagenvariablen den folgenden Wert: groovyScript ("new Random (). nextLong (). abs ()")
https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/
quelle
Außerdem können Sie eine Live-Vorlage hinzufügen, die die Arbeit erledigt.
Drücken Sie dazu Ctrl+Alt+S->
"Live Templates"
Abschnitt ->other
(oder w / w Sie wünschen)Und dann erstellen Sie eine neue mit einer Definition wie dieser:
Wählen Sie dann den
definition
Bereich aus und speichern Sie ihn unter'serial'
Jetzt können Sie den
serial
TABKlassenkörper eingeben.quelle
Eine andere Möglichkeit, die serialVersionUID zu generieren, besteht darin, sie
>Analyze >Run Inspection by Name
über das Kontextmenü (oder die Tastenkombination, die standardmäßig ctrl+ alt+ shift+ iist) zu verwenden und dann "Serializable class without 'serialVersionUID'" einzugeben (oder einfach "serialVersionUID" und den vorausgehenden Typ einzugeben Funktion wird es für Sie finden.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, ...).
Bei diesem Ansatz müssen Sie nicht einmal die allgemeinen Inspektionsregeln auf irgendetwas festlegen.
quelle
Mit Version
v2018.2.1
Gehe zu
Neben der Klassendeklaration sollte eine Warnung angezeigt werden.
quelle
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.
quelle
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 "FQ-Namen verkürzen". Geben Sie ihm einen Vorlagentext von nur:
Bearbeiten Sie nun die Variablen und setzen Sie die Seriennummer auf:
Es wird das Standard-Gradle-Projektlayout angenommen. Ändere / baue / zu / Ziel / für Maven.
quelle
Einfachste moderne Methode:
Alt
+Enter
anIntelliJ unterstreicht den Raum nach dem
=
. Setzen Sie den Cursor darauf und drücken Siealt
+Enter
(Option
+Enter
auf dem Mac). Sie erhalten ein Popover mit der Aufschrift "Randomly Change serialVersionUID Initializer". Drücken Sie einfach die Eingabetaste, und dieser Bereich wird mit einer zufälligen Länge gefüllt.quelle
Wenn Sie die fehlende serialVersionUID für eine Reihe von Dateien hinzufügen möchten, funktioniert IntelliJ IDEA möglicherweise nicht sehr gut. Ich überlege mir ein einfaches Skript, um dieses Ziel mit Leichtigkeit zu erreichen:
Sie speichern dieses Skript beispielsweise
add_serialVersionUID.sh
in Ihrem~/bin
Ordner. Anschließend führen Sie es im Stammverzeichnis Ihres Maven- oder Gradle-Projekts wie folgt aus:Diese .lst enthält die Liste der Java-Dateien zum Hinzufügen der serialVersionUID im folgenden Format:
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 zunächst keine serialVersionUID festgelegt wurde, während die Kompatibilität mit den alten Klassen erhalten bleibt.
quelle