Soyut bir sınıf bir serialVersionUİD olmalıdır
Java, bir sınıf seri hale getirilebilir uygular ama soyut bir serialVersionUİD uzun ilan etti, yoksa olması gereken bu alt sınıflar sadece gerektiriyor?
Bu durumda gerçekten tüm alt sınıflar bu tür amaçla RMI çağrıları olmak için seri ile anlaşma gibi bir niyeti vardır.
CEVAP
Bu serialVersionUİD deseralized bir nesne ve sınıf mevcut sürümü arasındaki uyumluluk belirlemek için sağlanır.
(Tabii ki, kurtulmak için istediğiniz derleyici bir uyarı oluşturmak değil mi?)
James' yorum doğru mu? çıkıyor Soyut temel sınıf serialVersionUİDyokalt sınıflar yayılır. O, senin ışığındayapınana sınıfında serialVersionUİD gerekiyor.
Test etmek için kod:
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() );
}
}
Alt temel oluşturmak ve bir nesneyi kaydetmek için bir kez çalıştırın. Sonra bambaşka bir serialVersionUİD Temel sınıf, açıklama satırları ana kaydetmek nesne (yani yok kalsın yine, sen sadece yüklemek için eskisini), ve tekrar. Bu özel bir durum neden olur
java.io.InvalidClassException: Base; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
() getClass soyut sınıf verir Belirsiz...
C# Soyut sınıf için Arayüz Kalıtım...
Java Soyut Jenerik ile Arayüzü Uygulay...
Scala'un kapalı soyut vs soyut sı...
Neden't soyut bir C üzerinde soyu...