2012-06-12 13 views
25

मैं जावा क्रमबद्धता को समझने पर ठोकर खा रहा हूं। मैंने कई दस्तावेज़ों और पुस्तकों में पढ़ा है कि स्थिर और क्षणिक चर जावा में क्रमबद्ध नहीं किए जा सकते हैं। हम निम्नानुसार एक serialVersionUid घोषित करते हैं।सीरियलाइजेशन प्रक्रिया में क्रमबद्ध स्थिर चर हैं

private static final long serialVersionUID = 1L; 

यदि एक स्थैतिक चर को क्रमबद्ध नहीं किया गया था, तो हम अक्सर डी-क्रमबद्ध प्रक्रिया के दौरान अपवाद का सामना करते हैं।

java.io.InvalidClassException 

जिसमें deserialized वस्तु से serialVersionUID निकाला जाता है और भरी हुई वर्ग के serialVersionUID साथ तुलना में है।

मेरे ज्ञान के लिए मुझे लगता है कि यदि स्थैतिक चर को क्रमबद्ध नहीं किया जा सकता है। उस अपवाद का कोई मतलब नहीं है। मैं गलत हो सकता हूं क्योंकि मैं अभी भी सीख रहा हूं।

क्या यह एक मिथक है कि "जावा में स्थिर और क्षणिक चर को क्रमबद्ध नहीं किया जा सकता"। कृपया मुझे सही करें, मैं इस अवधारणा के बारे में गड़बड़ में हूं।

उत्तर

39

serialVersionUID एक विशेष धारावाहिक और deserialization प्रक्रिया द्वारा उपयोग की जाने वाली स्थैतिक चर, यह सत्यापित करने के लिए कि एक स्थानीय वर्ग किसी ऑब्जेक्ट को क्रमबद्ध करने के लिए उपयोग की जाने वाली कक्षा के साथ संगत है। यह केवल दूसरों के रूप में एक स्थिर चर नहीं है, जो निश्चित रूप से क्रमबद्ध नहीं हैं।

जब किसी वर्ग का ऑब्जेक्ट क्रमबद्ध होता है, तो कक्षा का नाम और सीरियल संस्करण यूआईडी बाइट्स की धारा में लिखा जाता है। जब यह deserialized है, JVM जांचता है कि बाइट्स की धारा से पढ़ा गया सीरियल संस्करण यूआईडी स्थानीय वर्ग में से एक जैसा ही है। यदि वे नहीं हैं, तो यह ऑब्जेक्ट को deserialize करने का भी प्रयास नहीं करता है, क्योंकि यह जानता है कि कक्षाएं असंगत हैं।

+0

की एक विशेषता है विशेष स्थिर चर शब्द का क्या अर्थ है? – srk

+2

इसका मतलब है कि यह एक स्थिर चर है जो विशेष है। (विशेष रूप से, यह serialization में अन्य स्थिर चर से अलग व्यवहार किया जाता है।) –

+4

यह विशेष है, क्योंकि धारावाहिक तंत्र इस स्थैतिक चर के लिए देखता है यह जानने के लिए कि कक्षा का सीरियल संस्करण यूआईडी क्या है। अन्य सभी स्थैतिक चर केवल serialization तंत्र द्वारा अनदेखा कर रहे हैं। –

3

serialVersionUID विशेष है और इन नियमों के अधीन नहीं है। धारावाहिक मशीनरी के भीतर कोड है जो स्वचालित रूप से स्वचालित संस्करण जांच करने के लिए इस क्षेत्र को संभालता है।

48
  1. उदाहरण चर: ये चर धारावाहिक हैं, इसलिए अक्रमांकन दौरान हम वापस धारावाहिक राज्य मिल जाएगा।

  2. स्टेटिक चर:transient चर नहीं हैं: ये चर धारावाहिक

  3. क्षणिक चर नहीं हैं, तो अक्रमांकन दौरान स्थिर चर मूल्य वर्ग से लोड होगा (वर्तमान मूल्य लोड किया जाएगा।)। serialized, तो deserialization के दौरान उन चर को संबंधित डिफ़ॉल्ट मानों के साथ शुरू किया जाएगा (उदा: वस्तुओं null, int0) के लिए।

  4. सुपर वर्ग चर: सुपर वर्ग भी, Serializable इंटरफ़ेस तो उन चर धारावाहिक हो जाएगा लागू किया हैं अन्यथा यह सुपर वर्ग चर को क्रमानुसार नहीं होंगे। और deserializing, JVM सुपर क्लास में डिफ़ॉल्ट कन्स्ट्रक्टर चलाएगा और डिफ़ॉल्ट मान populates। सभी सुपरक्लास के लिए वही बात होगी।

+2

"तो जब deserialization स्थिर वैरिएबल मान कक्षा से लोड हो जाएगा। (वर्तमान मूल्य लोड हो जाएगा।)" क्या होगा अगर कक्षा को एक अलग जेवीएम में डी-धारावाहिक किया जा रहा है? – mdev

+0

@mdev: सही कथन यह होगा कि 'स्थैतिक' चर बिल्कुल छूए नहीं हैं। यह कहने का कोई मतलब नहीं है कि "स्थिर चर मूल्य वर्ग से लोड हो जाएगा" - अपने आप में। – Holger

1

उदाहरण नीचे के बारे में, स्थैतिक उदाहरण, क्षणिक बताते हैं और सुपर वर्ग क्रमबद्धता और उनके outputs varialbes।

serializing वर्ग:

public class SerializeEx extends SuperSerializeEx implements Serializable { 

    private static final long serialVersionUID = 1L; 
    public static int staticNumber = 1234; 
    public int instanceNumber = 1234; 

    public SerializeEx() { 
     staticNumber = 0; 
     instanceNumber = 0; 
     System.out.println("---sub class constructor---"); 
    } 

    public SerializeEx(int staticNumber, int instanceNumber, int superNumber) { 
     super(superNumber); 
     this.staticNumber = staticNumber; 
     this.instanceNumber = instanceNumber; 
    } 
} 

सुपर वर्ग:

public class SuperSerializeEx { 

    public int superNumber; 

    public SuperSerializeEx() { 
     System.out.println("---super class constructor---"); 
     this.superNumber = 1000; 
    } 

    public SuperSerializeEx(int superNumber) { 
     this.superNumber = superNumber; 
    } 
} 

क्रमबद्धता & Deserialization:

public class MainSerialization { 

    public static void main(String[] args) { 
     String fileName = "testing.txt"; 
     serialize(fileName); 
     deSerialize(fileName); 
    } 

    public static void serialize(String fileName) { 
     System.err.println("Serialize....."); 
     SerializeEx serializeMe = new SerializeEx(10, 10, 10); 
     FileOutputStream fos = null; 
     ObjectOutputStream out = null; 
     try { 
      fos = new FileOutputStream(fileName); 
      out = new ObjectOutputStream(fos); 
      out.writeObject(serializeMe); 
      out.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static void deSerialize(String fileName) { 
     System.err.println("DeSerialize....."); 
     SerializeEx time = null; 
     FileInputStream fis = null; 
     ObjectInputStream in = null; 
     try { 
      fis = new FileInputStream(fileName); 
      in = new ObjectInputStream(fis); 
      time = (SerializeEx) in.readObject(); 
      in.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     System.err.println("Instance Numer = " + time.instanceNumber + " \tStatic Number= " + time.staticNumber + " \t Super Number= " + time.superNumber); 
     SerializeEx serializeMe = new SerializeEx(1001, 1001, 1001); //Modifying the static and instnce variables 
     System.err.println("Instance Numer = " + time.instanceNumber + " \tStatic Number= " + time.staticNumber + " \t Super Number= " + time.superNumber); 
    } 
} 

आउटपुट:

---super class constructor--- 
Serialize..... 
DeSerialize..... 
Instance Numer = 10  Static Number= 10  Super Number= 1000 
Instance Numer = 10  Static Number= 1001 Super Number= 1000 
1

import java.io.FileInputStream; 
 
import java.io.FileNotFoundException; 
 
import java.io.FileOutputStream; 
 
import java.io.IOException; 
 
import java.io.ObjectInputStream; 
 
import java.io.ObjectOutputStream; 
 
import java.io.Serializable; 
 

 
class TestJava implements Serializable{ 
 
    public static int k = 10; 
 
    public int j=5; 
 
public static void main(String[] args) { 
 
    
 
    TestJava tj1= new TestJava(); 
 
    TestJava tj2; 
 
    
 
    
 
     try{ //serialization 
 
      FileOutputStream fos = new FileOutputStream("myclass.ser"); 
 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 
 
      oos.writeObject(tj1); 
 
      oos.close(); 
 
      fos.close(); 
 
      System.out.println("object serielized 1..."+tj1.j); 
 
      System.out.println("object serielized 2..."+tj1.k); 
 
      System.out.println("object serielized 3..."+k); 
 
      k=++k; // 'k' value incrementd after serialization 
 
      } catch(FileNotFoundException fnfe){ 
 
      fnfe.printStackTrace(); 
 
      } catch(IOException ioex){ 
 
      ioex.printStackTrace(); 
 
      } 
 
    
 
     
 
      try{ //deserialization 
 
       FileInputStream fis = new FileInputStream("myclass.ser"); 
 
       ObjectInputStream ois = new ObjectInputStream(fis); 
 
       tj2 = (TestJava) ois.readObject(); 
 
       ois.close(); 
 
       fis.close(); 
 
       System.out.println("object DEEEEserielized 1..."+tj2.j); 
 
       System.out.println("object DEEEEserielized 2..."+tj2.k); 
 
       System.out.println("object DEEEEserielized 3..."+k); 
 
      // in deserialization 'k' value is shown as incremented. 
 
      // That means Static varialbe 'K' is not serialized. 
 
      // if 'K' value is serialized then, it has to show old value before incrementd the 'K' value. 
 
      } catch(FileNotFoundException fnfe){ 
 
       fnfe.printStackTrace(); 
 
      } catch(IOException ioex){ 
 
       ioex.printStackTrace(); 
 
      } catch(ClassNotFoundException CNFE){ 
 
       CNFE.printStackTrace();     
 
      } 
 
     } 
 
} 
 

 
/* Output of the above program 
 
    
 
object serielized 1...5 
 
object serielized 2...10 
 
object serielized 3...10 
 
object DEEEEserielized 1...5 
 
object DEEEEserielized 2...11 
 
object DEEEEserielized 3...11 
 

 

 
*/

1

serialVersionUID भी इस मामले में धारावाहिक है।

कक्षा प्रारंभिकरण के दौरान मूल्य प्रदान किए जाने वाले किसी स्थिर चर को क्रमबद्ध किया गया है।

हालांकि सामान्य मामलों में, जहां आप मुख्य कक्षा/रन-टाइम पर स्थिर चर के लिए मूल्य प्रदान करेंगे, को क्रमबद्ध नहीं किया जाएगा।

आप इसे सार्वजनिक करके इसे serialVersionUID तक पहुंचने का प्रयास कर सकते हैं और deserialization के बाद इसे एक्सेस करने का प्रयास कर सकते हैं।

अधिक जानकारी के लिए आप "http://javabeginnerstutorial.com/core-java-tutorial/transient-vs-static-variable-java/" देख सकते हैं।

उम्मीद है कि मदद करता है। चीयर्स !!

0

नहीं, यदि किसी वर्ग में स्थैतिक चर होता है तो धारावाहिकता के समय उस चर को छोड़ दिया जाएगा। क्योंकि स्थिर ऑब्जेक्ट सभी ऑब्जेक्ट के लिए अद्वितीय है और क्रमबद्धता केवल ऑब्जेक्ट गुणों (ऑब्जेक्ट की स्थिति) को सहेजने के लिए उपयोग की जाती है। स्थैतिक चर वर्ग

संबंधित मुद्दे