Serializacion De Objetos En Java
Veremos como funciona en Java la serialización de objetos, y porqué es importante setear el campo serialVersionUID para aquellos objetos que tengan que ser serializados.
La serialización de un objeto
Al serializar un objeto, el estado del mismo es converitdo a un stream de bits y transmitido por algún medio para que, eventualmente, algún consumidor lo deserealice.
Ahora bien, existen entonces 2 clases: la clase "origen" (de la cual ocurre la serialización), y la clase "destino", sobre la cual se toman los datos serializados y se reconstruye el objeto. Estas clases, usualmente, residen en máquinas virtuales distintas (de hecho, hasta en equipos distintos).
La JVM deberá asegurar, de alguna manera, que la "versión" de la clase origen sea compatible con la versión en donde se intentará deserializar. Para hacer esto, utiliza el atributo serialVersionUID que pueden tener los objetos Serializables.
Si el serialVersionUID del origen (el cual es enviado al serializar) coincide con la clase en donde se deserealizará el objeto, entonces la de-serealización ocurre exitosamente. Sino, la misma falla indicando que las clases no son compatibles.
No es obligatorio sobre-escribir el serialVersionUID, ya que el compilador genera automáticamente una versión basándose en varios parámetros... pero este número generado automáticamente puede cambiar facilmente dependiendo del compilador.
Es por esto último que siempre se recomiendo sobre-escribir el atributo serialVersionUID en cada clase que sea serializada, asignándole un valor arbitario que represente la "versión" de nuestro objeto.
Seteando el serialVersionUID
Para setear la versión del objeto es tan simple como agregarle el atributo privado:
private static final long serialVersionUID = 10L;
El serialVersionUID debe declararse en cada clase que sea serializada, incluso en padres de herencia.