Il serialVersionUID viene fornito per determinare la compatibilità tra un oggetto deseralizzato e la versione corrente della classe.
Come tale, non è realmente necessario nella prima versione di una classe, o in questo caso, in una classe base astratta. Non avrai mai un'istanza di quella classe astratta per serializzare/deserializzare, quindi non ha bisogno di un serialVersionUID.
(Naturalmente, lo fa generare un avviso del compilatore, che si vuole sbarazzarsi di, giusto?)
Si scopre commento di James è corretta. Il serialVersionUID di una classe di base astratta fa viene propagato in sottoclassi. Alla luce di questo, è do necessario serialVersionUID nella classe base.
Il codice di prova:
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());
}
}
Eseguire il principale secondario una volta per farlo creare e salvare un oggetto. Quindi cambia il serialVersionUID nella classe Base, commenta le linee in main che salvano l'oggetto (quindi non lo salva di nuovo, vuoi solo caricare quello vecchio) ed eseguilo di nuovo. Questo si tradurrà in un'eccezione
java.io.InvalidClassException: Base; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
fonte
2009-05-21 14:50:40
Continuo a scrivere una risposta, realizzando che non lo so, anche se ho la sensazione. +1 per una domanda a cui non posso rispondere. –