serialVersionUID 2

Posted by jorge on September 16, 2007

The serializable class Foo does not declare a static final serialVersionUID field of type long. Para deshacerte de este warning de eclipse: window > preferences > java > compiler > errors/warnings >  potential programming problems y allí marcas “Serializable class without SerialVersionUID” a “Ignore”. Prácticamente todo el mundo puede ignorar tranquilamente el serial version uid, pero si quieres saber de qué te está avisando el bueno de eclipse, sigue leyendo.

Que una clase sea serializable quiere decir que sus instancias pueden escribirse y leerse en, por ejemplo, un fichero. La clase puede cambiar con el tiempo, y algunos cambios pueden hacer que la serialización/deserialización de esa clase cambie. El atributo serialVersionUID indica con qué versión de una clase se ha serializado una instancia dada. De esa forma, el que vaya a deserializarla sabe de antemano si va a poder o no.

Una solución particularmente simple es poner como serial la fecha del cambio:

private static final long serialVersionUID = 20070901L;

Si alguna vez se cambia algo que afecte a la serialización del objeto, se cambia esa fecha.

Es bastante sencillo y tiene mucho sentido, pero yo llevaba un añito viendo el warning de marras y no tenía muy claro qué era ese mensaje. Comparto un vicio con la mayoría de mis colegas. Vicio que muchos de un tiempo a esta parte insisten en llamar virtud, y es que primero disparo y luego pregunto. A veces ni pregunto. El caso es que a menudo me olvido de recuperar los cadáveres que dejé en el camino: “esto es una ñapa pero cuando funcione todo lo dejaré bonito” o peor: “¡cómo mola! ¡no me explico que no pete!”.

Los warning son víctimas propiciatorias de esta política tan pragmática de aceptación de daños colaterales, y el serialVersionUID no iba a ser menos: “coño, qué warning más persistente”. He utilizado la palabra pragmático aposta, y es que lo que se considera oficialmente el programador pragmático diría exactamente lo contrario de lo que he dicho yo aquí. Hace muy poco me leí una especie de catecismo del programador ágil, y una de las pocas enseñanzas que saqué fue precisamente que considerase los warnings como errores. Que si eclipse los había puesto ahí sería por algo. Justo lo contrario de lo que yo he entendido siempre por pragmatismo. En fin, será cuestión de revisar mi vocabulario.

Trackbacks

Use this link to trackback from your own site.

Comments

Leave a response

  1. Gea Tue, 02 Oct 2007 12:02:07 UTC

    un altre exemple de pragmatisme (també des del meu punt de vista) seria deixar que l’amic eclipse solucioni el problema sense ni tant sols saber què ha fet. I es que a mes ho pot fer!! D’aquesta manera gires l’esquena al possible problema, que ja no ho es, i vas fent fins que t’hi enfrontes sens saber ni per on començar. Però funciona…

  2. jonatha Tue, 25 Mar 2008 17:53:02 UTC

    hola tengo un problema paresido estoy trabajando con objetos y lo guardo en archivos y me sale esa
    Mar 25, 2008 9:42:35 AM TACORO jMenuItem4ActionPerformed
    SEVERE: null
    java.io.InvalidClassException: LISTA_Clientes; local class incompatible: stream classdesc serialVersionUID = 1268858420717246866, local class serialVersionUID = 3579171388697917447

    como podria solucionarlo saludos

Comments