धारावाहिक वस्तु और कक्षा के वर्तमान संस्करण के बीच संगतता निर्धारित करने के लिए धारावाहिक VersionUID प्रदान किया जाता है।
इस प्रकार, यह कक्षा के पहले संस्करण में, या इस मामले में, एक सार आधार वर्ग में वास्तव में आवश्यक नहीं है। आपके पास धारावाहिक/deserialize करने के लिए उस सार वर्ग का एक उदाहरण कभी नहीं होगा, इसलिए इसे एक serialVersionUID की आवश्यकता नहीं है।
(बेशक, यह एक संकलक चेतावनी, आप से छुटकारा पाने के लिए चाहते हैं जो उत्पन्न, सही है?)
यह पता चला जेम्स 'टिप्पणी सही है। एक सार आधार वर्ग का serialVersionUID उपclasses के लिए प्रचारित हो जाता है। उस के प्रकाश में, आप को अपने बेस क्लास में serialVersionUID की आवश्यकता है।
कोड परीक्षण करने के लिए:
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());
}
}
भागो उप में मुख्य एक बार यह एक वस्तु बना सकते हैं और बचाने के लिए मिलता है। फिर बेस क्लास में serialVersionUID को बदलें, मुख्य रूप से पंक्तियों को टिप्पणी करें जो वस्तु को सहेजते हैं (इसलिए यह इसे फिर से सहेजता नहीं है, आप बस पुराने को लोड करना चाहते हैं), और इसे फिर से चलाएं। यह एक अपवाद में परिणाम
java.io.InvalidClassException: Base; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
स्रोत
2009-05-21 14:50:40
मैं एक उत्तर लिखना जारी रखता हूं, फिर महसूस करता हूं कि मुझे काफी जानकारी नहीं है, हालांकि मेरे पास एक झटका है। एक प्रश्न के लिए +1 मैं जवाब नहीं दे सकता। –