पहले मुझे यह समझाने की आवश्यकता है कि क्रमबद्धता क्या है।
सीरियलाइज़ेशन किसी ऑब्जेक्ट को स्ट्रीम में कनवर्ट करने की अनुमति देता है, उस ऑब्जेक्ट को नेटवर्क पर भेजने या पत्र उपयोग के लिए डीबी में सहेजने या सहेजने के लिए।
क्रमबद्धता के लिए कुछ नियम हैं ।
कोई ऑब्जेक्ट केवल तभी सीरियल करने योग्य होता है जब उसका वर्ग या उसका सुपरक्लास सीरियल के इंटरफ़ेस को लागू करता है
एक ऑब्जेक्ट सीरियलाइज़ेबल होता है (यदि वह सुपरक्लास नहीं है, तो भी सीरियल इंटरफ़ेस को लागू करता है)। हालांकि, सीरियलस्टेबल श्रेणी के पदानुक्रम में पहला सुपरक्लास, जो कि सीरियल योग्य इंटरफ़ेस को लागू नहीं करता है, MUST में एक नो-आर्ग कंस्ट्रक्टर है। यदि इसका उल्लंघन होता है, तो readObject () एक java.io.InvalidClassException को रनटाइम में उत्पन्न करेगा
सभी आदिम प्रकार क्रमिक हैं।
क्षणिक क्षेत्र (क्षणिक संशोधक के साथ) क्रमबद्ध नहीं होते हैं, (अर्थात, सहेजे या बहाल नहीं)। एक वर्ग जो सीरियल को लागू करता है, उसे उन वर्गों के क्षणिक क्षेत्रों को चिह्नित करना चाहिए जो क्रमबद्धता का समर्थन नहीं करते हैं (उदाहरण के लिए, एक फ़ाइल स्ट्रीम)।
स्थैतिक क्षेत्र (स्थिर संशोधक के साथ) क्रमबद्ध नहीं हैं।
जब Object
सीरियलबद्ध किया जाता है, तो जावा रनटाइम धारावाहिक संस्करण क्रमांक उर्फ, को संबद्ध करता है serialVersionID
।
जहां हमें serialVersionID की आवश्यकता होती है:
यह सत्यापित करने के लिए कि वाष्पीकरण के दौरान कि प्रेषक और रिसीवर क्रमबद्धता के संबंध में संगत हैं। यदि रिसीवर ने कक्षा को एक अलग से लोड किया है,serialVersionID
तो deserialization के साथ समाप्त हो जाएगाInvalidClassCastException
।
एक अनुक्रमिक वर्ग अपने स्वयं केserialVersionUID
स्पष्ट रूप से घोषित कर सकता है एक क्षेत्र की घोषणा की जिसका नामserialVersionUID
स्थिर, अंतिम और लंबा प्रकार होना चाहिए।
आइए एक उदाहरण के साथ यह कोशिश करें।
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String empname;
private byte empage;
public String getEmpName() {
return name;
}
public void setEmpName(String empname) {
this.empname = empname;
}
public byte getEmpAge() {
return empage;
}
public void setEmpAge(byte empage) {
this.empage = empage;
}
public String whoIsThis() {
StringBuffer employee = new StringBuffer();
employee.append(getEmpName()).append(" is ).append(getEmpAge()).append("
years old "));
return employee.toString();
}
}
सीरियलाइज़ ऑब्जेक्ट बनाएँ
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Writer {
public static void main(String[] args) throws IOException {
Employee employee = new Employee();
employee.setEmpName("Jagdish");
employee.setEmpAge((byte) 30);
FileOutputStream fout = new
FileOutputStream("/users/Jagdish.vala/employee.obj");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(employee);
oos.close();
System.out.println("Process complete");
}
}
वस्तु का वर्णन करना
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Reader {
public static void main(String[] args) throws ClassNotFoundException,
IOException {
Employee employee = new Employee();
FileInputStream fin = new
FileInputStream("/users/Jagdish.vala/employee.obj");
ObjectInputStream ois = new ObjectInputStream(fin);
employee = (Employee) ois.readObject();
ois.close();
System.out.println(employee.whoIsThis());
}
}
नोट: अब कर्मचारी वर्ग के क्रम-निर्धारण को बदलें और सहेजें:
private static final long serialVersionUID = 4L;
और पाठक वर्ग को निष्पादित करें। लेखक वर्ग को निष्पादित करने के लिए नहीं और आपको अपवाद मिलेगा।
Exception in thread "main" java.io.InvalidClassException:
com.jagdish.vala.java.serialVersion.Employee; local class incompatible:
stream classdesc serialVersionUID = 1, local class serialVersionUID = 4
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.krishantha.sample.java.serialVersion.Reader.main(Reader.java:14)