serial long intellij generate generar calculate java serialization intellij-idea

java - long - IntelliJ IDEA generando serialVersionUID



private static final long serialversionuid (10)

Además puede agregar una plantilla viva que hará el trabajo.

Para hacerlo, presione Ctrl + Alt + S -> sección "Live Templates" -> other (o w / e que desee)

Y luego crea uno nuevo con una definición como esta:

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

Luego seleccione el alcance de definition y guárdelo como ''serial''

Ahora puedes escribir TAB serial en el cuerpo de la clase.

¿Cómo generar este valor en IntelliJ IDEA?

Voy a Configuración -> Errores -> Problemas de serialización -> Clase serializable sin ''serialVersionUID'', pero todavía no me muestra la advertencia. Mi clase PKladrBuilding padre implementa interfaz Serializable .

Parte del código:

public class PKladrBuilding extends PRQObject public abstract class PRQObject extends PObject public abstract class PObject implements Serializable


Agregue una plantilla activa llamada "ser" al otro grupo, configúrela a "Aplicable en Java: declaración", y desmarque "Acortar nombres de FQ". Dale una plantilla de texto de solo:

$serial$

Ahora edita las variables y configura la serie a:

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

Asume el diseño estándar del proyecto Gradle. Cambiar / construir / a / objetivo / para Maven.


Con versión v2018.2.1

Ir

Preferencia> Editor> Inspecciones> Java> Problemas de serialización> alternar "Clase serializable sin ''serialVersionUID''".

Una advertencia debe aparecer junto a la declaración de clase


Después de dedicar un tiempo a la serialización, encuentro que, no debemos generar serialVersionUID con algún valor aleatorio, debemos darle un valor significativo.

Aquí hay un comentario de detalles sobre esto. Estoy haciendo frente al comentario aquí.

En realidad, no debe estar "generando" UID de versión serie. Es una "característica" estúpida que se deriva de la falta de comprensión general de cómo se utiliza ese ID en Java. Debería dar a estos ID valores significativos y legibles, por ejemplo, comenzar con 1L, e incrementarlos cada vez que piense que la nueva versión de la clase debería hacer que todas las versiones anteriores (que podrían estar serializadas previamente) sean obsoletas. Todas las utilidades que generan dichos ID básicamente hacen lo que hace la JVM cuando no se define el ID: generan el valor basado en el contenido del archivo de clase, por lo que aparecen enteros largos sin sentido ilegibles. Si desea que todas y cada una de las versiones de su clase sean distintas (a los ojos de la JVM), entonces ni siquiera debe especificar el valor serialVersionUID, una vez que la JVM produzca una sobre la marcha, y el valor de cada versión de su clase ser único. El propósito de definir ese valor explícitamente es decirle al mecanismo de serialización que trate diferentes versiones de la clase que tienen el mismo SVUID como si fueran iguales, por ejemplo, para no rechazar las versiones serializadas más antiguas. Entonces, si define la ID y nunca la cambia (y asumo que eso es lo que hace ya que confía en la generación automática, y probablemente nunca vuelva a generar sus ID), está asegurando que todas las versiones, incluso absolutamente diferentes, de Su clase será considerada igual por el mecanismo de serialización. ¿Es eso lo que quieres? Si no, y si realmente quiere tener control sobre cómo se reconocen sus objetos, debe usar valores simples que usted mismo pueda entender y actualizar fácilmente cuando decida que la clase ha cambiado significativamente. Tener un valor de 23 dígitos no ayuda en absoluto.

Espero que esto ayude. Buena suerte.


Estoy usando Android Studio 2.1 y tengo mejor consistencia para obtener la bombilla al hacer clic en el nombre de la clase y pasar el mouse sobre él por un segundo.


Instale el complemento GenerateSerialVersionUID de Olivier Descout.

Vaya a: menú ArchivoConfiguraciónComplementosBuscar repositoriosGenerateSerialVersionUID

Instala el plugin y reinicia.

Ahora puede generar el ID desde el menú CódigoGenerar → serialVersionUID` o el acceso directo.


No estoy seguro de si tiene una versión anterior de IntelliJ IDEA, pero si voy al menú ArchivoConfiguración ...InspeccionesProblemas de serialización → Clase serializable sin ''serialVersionUID'' habilitada, la clase que proporcione me advertirá.

Si intento la primera clase veo:

BTW: No me mostró una advertencia hasta que agregué { } al final de cada clase para corregir el error de compilación.



Si desea agregar el serialVersionUID ausente para un grupo de archivos, IntelliJ IDEA puede no funcionar muy bien. Vengo con un script simple para cumplir este objetivo con facilidad:

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

Guarda este script, por ejemplo, como add_serialVersionUID.sh en su carpeta ~/bin . Luego lo ejecutas en el directorio raíz de tu proyecto Maven o Gradle como:

add_serialVersionUID.sh < myJavaToAmend.lst

Este .lst incluye la lista de archivos Java para agregar el serialVersionUID en el siguiente formato:

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

Este script utiliza la herramienta serialVer JDK. Es ideal para una situación en la que desea enmendar un gran número de clases que no tenían configurado serialVersionUID en primer lugar y mantener la compatibilidad con las clases anteriores.


Sin ningún complemento: solo necesitas habilitar el resaltado en IntelliJ:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without ''serialVersionUID'' : establezca la IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without ''serialVersionUID'' y haga clic en ''OK'' .

Ahora, si su clase implementa Serializable , verá resaltado, y alt+Enter en nombre de clase propondrá generar un número de serie private static final long serialVersionUID .