2012-08-09 4 views
5

que tiene la firma siguiente clase y ClientEventSourc implementa Serializable:Comprensión de FindBugs que advierten sobre el campo serialVersionUID

public class Grid extends ClientEventSource implements Focusable, FramingBlockWrapper,LIMSEditableField 

Ahora FindBugs está enumerando esto como poco fiables:

clase es Serializable, pero no define serialVersionUID

Esta clase implementa el Serializable interfaz, pero no define un campo serialVersionUID. Un cambio tan simple como agregar una referencia a un objeto .class agregará campos sintéticos a la clase, que lamentablemente cambiará el serialVersionUID implícito (por ejemplo, agregar una referencia a String.class generará un campo estático clase $ java $ lang $ String). Además, diferentes compiladores de código fuente a bytecode pueden usar diferentes convenciones de nomenclatura para las variables sintéticas generadas para referencias a objetos de clase o clases internas. Para garantizar la interoperabilidad de Serializable en todas las versiones, considere agregar un explícito serialVersionUID.

¿Puede alguien explicar lo que significa y cuál es la mejor manera de solucionarlo?

Respuesta

7

serialVersionUID se utiliza para deserializar su clase. se genera automáticamente de forma predeterminada.
pero cambiar cualquier cosa en su clase generaría un serialVersionUID diferente y no se pueden deserializar objetos "antiguos".
para que defina su propio serialVersionUID para ayudar a la deserialización a encontrar la clase correcta.

agregar una variable como esto a su código:

private static final long serialVersionUID = 6106269076155338045L; 

para referencia en la generación de su UID:

Does it matter what I choose for serialVersionUID when extending Serializable classes in Java?

+0

¿Hay algún algoritmo/programa que genere este número? Me refiero a si puede ser cualquier cosa o si necesita seguir ciertas mejores prácticas, ya que hashcode() hace lo que se describe en el libro efectivo de Java e implementado en EqualsBuilder y HashCodeBuilder desde apache commons. – Geek

+0

Este número puede ser cualquier cosa, siempre que sea único entre sus clases serializadas. Eclipse f.e. tiene su propio generador, pero puedes usar cualquier número. – Kostronor

2

Pueden algunos explicar lo que significa

Cambios menores a la clase cambian el serialVersionUID que no desea, ya que esto puede evitar la deserialización sin una buena razón.

y ¿cuál es la mejor manera de arreglar esto?

Configúrelo como sugiere.

private static final long serialVersionUID = 1; 

¿hay algún algoritmo/programa que genera este número

Sí. Este es el algoritmo que está intentando omitir, no recrear. Simplemente comience al 1.

quiero decir que puede ser cualquier cosa o que hay que seguir ciertas prácticas recomendadas

se recomienda usar 1 es la mejor práctica, ya que deja claro que esto era un valor overriden elegido arbitrariamente. Usar un valor grande como 6106269076155338045L podría parecerse a un número generado o elegir este número de razón.

+0

¿Es esta una buena opción? ¿Puedes responder mi comentario a la respuesta de Kostronor? – Geek

+0

La elección del valor no importa. Debe cambiarlo cada vez que realice un cambio de rotura. es decir, cada vez que realice un cambio en el que no desee que se deserialicen otras versiones como esta versión. En mi experiencia, esto es casi nunca. ;) –

1

Este valor se utiliza en la deserialización. Su propósito es mantener la compatibilidad entre las clases y sus objetos serializados correspondientes. Si serializa un objeto de tipo A y luego cambia A de alguna manera, entonces este mecanismo evita que deserialice el objeto; el objeto y su clase no coincidirían y obtendría errores de tiempo de ejecución.

Hay un serialver.exe en el JDK. Si le da un archivo .class como parámetro, escupirá un serialVersionUID. La mayoría de los entornos de desarrollo han esta funcionalidad incorporada en

Ejemplo de entrada:.

> serialver MyClass 

(ya existe un archivo MyClass.class y MyClass deben implementar Serializable)

Ejemplo de salida:

> MyClass: static final long serialVersionUID = -8174364448753809256L; 

Si odias hacer cosas en la línea de comando, entonces ejecuta el programa así:

> serialver -show 

mostrará este GUI:

serialver screenshot

continuación, puede teclear el nombre de la clase y haga clic en "Mostrar".

Le recomiendo que lea sobre el proceso de serialización si le interesa. Descubrirá exactamente por qué se necesita este ID de versión, qué campos/métodos se tienen en cuenta al generarlo y mucho más.

+0

¿Sabes cómo hacer esto en Intellij Idea? – Geek

+0

@Geek No, lo siento. Solo usé ese IDE por unas horas ... Sé cómo hacerlo en Eclipse y en Netbeans. –

Cuestiones relacionadas