web-dev-qa-db-fra.com

IntelliJ IDEA générant serialVersionUID

Comment générer cette valeur dans IntelliJ IDEA?

Je vais à Paramètres -> Erreurs -> Problèmes de sérialisation -> Classe sérialisable sans 'serialVersionUID', mais il ne me montre toujours pas le Attention. Ma classe parent PKladrBuilding implémente interface Serializable.

Une partie du code:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable
276
Kirill Bazarov

Je ne sais pas si vous avez une ancienne version d'IntelliJ IDEA, mais si je vais au menu FichierParamètres ...InspectionsProblèmes de sérialisation → Classe sérialisable sans l'option "serialVersionUID", la classe que vous fournissez me donne des avertissements.

Enter image description here

Si je tente le premier cours, je vois:

Enter image description here

BTW: Il ne m'a pas montré d'avertissement jusqu'à ce que j'ai ajouté { } à la fin de chaque classe pour corriger l'erreur de compilation.

551
Peter Lawrey

Installez le plugin GenerateSerialVersionUID d’Olivier Descout.

Aller à: menu Fichier Paramètres Plugins Parcourir les dépôts GenerateSerialVersionUID

Installez le plugin et redémarrez.

Vous pouvez maintenant générer l'identifiant à partir du menu Code Générer → serialVersionUID` ou le raccourci.

161
Sileria

Sans plugins: il vous suffit d'activer la surbrillance dans IntelliJ:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' - positionnez l'indicateur et cliquez sur 'OK'.

Maintenant, si votre classe implémente Serializable, vous verrez le surlignement, et alt+Enter sur le nom de la classe proposera de générer private static final long serialVersionUID.

PS: Tiré de ici

57
Nikhil Katre

Après avoir passé un peu de temps sur la sérialisation, je trouve que nous ne devrions pas générer serialVersionUID avec une valeur aléatoire, nous devrions lui donner une valeur significative.

Voici un commentaire de détail à ce sujet. Je m'occupe du commentaire ici.

En fait, vous ne devriez pas "générer" d'UID de version série. C'est une "fonctionnalité" stupide qui découle de l'incompréhension générale sur la façon dont cet identifiant est utilisé par Java. Vous devez donner à ces ID des valeurs lisibles et explicites, par exemple. en commençant par 1L et en les incrémentant chaque fois que vous pensez que la nouvelle version de la classe doit rendre toutes les versions précédentes (éventuellement sérialisées) obsolètes. Tous les utilitaires qui génèrent de tels ID font essentiellement ce que fait la machine virtuelle lorsque l’ID n’est pas défini: ils génèrent la valeur en fonction du contenu du fichier de classe, générant ainsi des entiers longs illisibles. Si vous souhaitez que chaque version de votre classe soit distincte (aux yeux de la machine virtuelle), vous ne devez même pas spécifier la valeur serialVersionUID car la machine virtuelle en produira une à la volée, et la valeur de chaque version de votre classe être unique. Le but de la définition explicite de cette valeur est d’indiquer au mécanisme de sérialisation de traiter différentes versions de la classe ayant le même SVUID que si elles étaient identiques, par exemple. ne pas rejeter les anciennes versions sérialisées. Donc, si vous définissez l’ID et ne le modifiez jamais (et je suppose que c’est ce que vous faites puisque vous comptez sur la génération automatique et que vous ne re-générez probablement jamais vos identifiants), vous vous assurez que toutes les versions - même les plus différentes - de votre classe sera considérée comme identique par le mécanisme de sérialisation. Est-ce que c'est ce que tu veux? Si ce n'est pas le cas, et si vous souhaitez réellement contrôler la manière dont vos objets sont reconnus, vous devez utiliser des valeurs simples que vous pouvez comprendre et que vous pouvez facilement mettre à jour lorsque vous décidez que la classe a considérablement changé. Avoir une valeur à 23 chiffres n'aide pas du tout.

J'espère que cela t'aides. Bonne chance.

35
Emdadul Sawon

Afin de générer l'utilisation de la valeur

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

et indiquez à la variable de modèle randomLong la valeur suivante: groovyScript ("new Random (). nextLong (). abs ()")

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

16
pharsfalvi

En outre, vous pouvez ajouter un modèle en direct qui fera le travail.

Pour le faire, appuyez sur Ctrl+Alt+S -> "Live Templates" section -> other (ou si vous le souhaitez)

Et créez-en un nouveau avec une définition comme celle-ci:

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

Puis sélectionnez definition scope et enregistrez-le sous le nom 'serial'

Maintenant, vous pouvez taper serialTAB dans le corps de la classe.

13
fallens4e

Avec la version v2018.2.1

Aller à

Préférence> Editeur> Inspections> Java> Problèmes de sérialisation> basculez "Classe sérialisable sans 'serialVersionUID'".

Un avertissement doit apparaître à côté de la déclaration de classe.

2
YLyu

Ajoutez un modèle dynamique appelé "ser" à l'autre groupe, réglez-le sur "Applicable en Java: déclaration", puis décochez "Raccourcir les noms FQ". Donnez-lui un modèle de texte de juste:

$serial$

Maintenant, éditez les variables et définissez série sur:

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

Il assume la mise en page standard du projet Gradle. Changez/build/to/target/pour Maven.

1
Greg Allen

J'utilise Android Studio 2.1 et la cohérence de l'obtention de l'ampoule est améliorée en cliquant sur le nom de la classe et en la survolant pendant une seconde.

1
Johnny Wu

Une autre façon de générer serialVersionUID consiste à utiliser >Analyze >Run Inspection by Name dans le menu contextuel (ou le raccourci clavier, qui est <Ctrl>+<Shift>+<Alt>+I par défaut), puis à saisir "Classe sérialisable sans 'serialVersionUID'" (ou simplement "serialVersionUID" et la fonction type à venir le trouveront pour vous.

Idea >Analyze >Run Inspection by Name Vous obtiendrez alors un menu contextuel dans lequel vous pourrez choisir où exécuter les inspections (par exemple, à partir d'un module spécifique, d'un projet entier, d'un fichier, ...)

Avec cette approche, vous n'avez même pas à définir les règles générales d'inspection.

1
Alexander

Si vous souhaitez ajouter le serialVersionUID absent à un groupe de fichiers, IntelliJ IDEA risque de ne pas fonctionner correctement. Je trouve un script simple pour atteindre cet objectif avec facilité:

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

Vous sauvegardez ce script, dites add_serialVersionUID.sh dans votre dossier ~/bin. Ensuite, vous l’exécutez dans le répertoire racine de votre projet Maven ou Gradle, comme suit:

add_serialVersionUID.sh < myJavaToAmend.lst

Ce fichier .lst inclut la liste des fichiers Java auxquels le serialVersionUID est ajouté au format suivant:

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

Ce script utilise l'outil série JDK. Il est idéal dans les situations où vous souhaitez modifier un grand nombre de classes pour lesquelles aucun serialVersionUID n'a été défini tout en conservant la compatibilité avec les anciennes classes.

0
schnell18