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
Je ne sais pas si vous avez une ancienne version d'IntelliJ IDEA, mais si je vais au menu Fichier → Paramètres ... → Inspections → Problèmes de sérialisation → Classe sérialisable sans l'option "serialVersionUID", la classe que vous fournissez me donne des avertissements.
Si je tente le premier cours, je vois:
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.
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.
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
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.
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/
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 serial
TAB dans le corps de la classe.
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.
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.
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.
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.
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.
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.