SORU
21 Mayıs 2009, PERŞEMBE


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
21 Mayıs 2009, PERŞEMBE


Bu serialVersionUİD deseralized bir nesne ve sınıf mevcut sürümü arasındaki uyumluluk belirlemek için sağlanır.Gibi, gerçekten bir sınıf, ya da bu durumda, soyut temel sınıf içinde ilk sürümü gerekli değildir. Hiç/serisini seri hale getirmek için soyut sınıf örneği olacak, bir serialVersionUİD ihtiyacı yok.

(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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B4ROK

    B4ROK

    1 EKİM 2008
  • cyriak

    cyriak

    29 Mart 2006
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006