El serialVersionUID se proporciona para determinar la compatibilidad entre un objeto desescalado y la versión actual de la clase.
Como tal, no es realmente necesario en la primera versión de una clase, o en este caso, en una clase base abstracta. Nunca tendrá una instancia de esa clase abstracta para serializar/deserializar, por lo que no necesita un serialVersionUID.
(Por supuesto, esto generará una advertencia del compilador, que desea quitarse de encima, ¿verdad?)
Resulta comentario de James es correcta. El serialVersionUID de una clase base abstracta hace que se propague a subclases. A la luz de eso, usted do necesita el serialVersionUID en su clase base.
El código de prueba:
import java.io.Serializable;
public abstract class Base implements Serializable {
private int x = 0;
private int y = 0;
private static final long serialVersionUID = 1L;
public String toString()
{
return "Base X: " + x + ", Base Y: " + y;
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Sub extends Base {
private int z = 0;
private static final long serialVersionUID = 1000L;
public String toString()
{
return super.toString() + ", Sub Z: " + z;
}
public static void main(String[] args)
{
Sub s1 = new Sub();
System.out.println(s1.toString());
// Serialize the object and save it to a file
try {
FileOutputStream fout = new FileOutputStream("object.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(s1);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
Sub s2 = null;
// Load the file and deserialize the object
try {
FileInputStream fin = new FileInputStream("object.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
s2 = (Sub) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s2.toString());
}
}
Ejecutar el principal Sub vez para conseguirlo para crear y guardar un objeto. Luego cambie el serialVersionUID en la clase Base, comente las líneas en main que guardan el objeto (para que no lo guarde de nuevo, solo quiera cargar el anterior) y ejecútelo nuevamente. Esto dará lugar a una excepción
java.io.InvalidClassException: Base; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
Sigo empezando a escribir una respuesta, y luego me doy cuenta de que no sé exactamente, aunque tengo una corazonada. +1 por una pregunta que no puedo responder. –