2012-10-08 18 views
7
public class MySerializable implements Serializable{ 

    private int x=10; 
    private static int y = 15; 
    public static void main(String...args){ 
     AnotherClass a = new AnotherClass(); 
     AnotherClass b; 
     //Serialize 
     try { 
      FileOutputStream fout = new FileOutputStream("MyFile.ser"); 
      ObjectOutputStream Oout = new ObjectOutputStream(fout); 
      Oout.writeObject(a); 
      System.out.println(a.toString()); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     //De-serialize 
     try { 
      FileInputStream fis = new FileInputStream("MyFile.ser"); 
      ObjectInputStream Oin = new ObjectInputStream (fis); 
      b = (AnotherClass) Oin.readObject(); 
      System.out.println(b.toString()); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }catch (ClassNotFoundException e){ 
      e.printStackTrace(); 
     } 

    } 
} 

class AnotherClass implements Serializable{ 

    transient int x = 8; 
    static int y = 9; 

    @Override 
    public String toString() { 
     return "x : " + x + ", y :" + y; 
    } 
} 

क्या आप कृपया मुझे बता सकते हैं कि स्थैतिक चर को क्रमबद्ध कैसे किया जाता है ??स्थैतिक चर कैसे आते हैं?

उत्तर

11

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

मान लीजिए कि आपको स्थिर चर को क्रमबद्ध करने की अनुमति थी। फिर, जब आप आवृत्ति को deserialize, तो आप उस चर की एक पुरानी प्रति प्राप्त हो जाएगा, जो तब से बदल दिया गया हो सकता है। चूंकि स्थैतिक चर वर्ग के सभी उदाहरणों में साझा किया जाता है, इसलिए किसी भी उदाहरण से चर में परिवर्तन को इस उदाहरण में प्रतिबिंबित किया जाना चाहिए।

इसलिए, उन्हें क्रमबद्ध नहीं किया जाना चाहिए, क्योंकि इन स्थितियों के तहत चर संभवतः एक स्थिर चर के रूप में अपने अनुबंध का उल्लंघन कर सकता है।

क्रमबद्धता: -

  • स्थैतिक चर को क्रमानुसार नहीं करना चाहिए ..

Deserialization: -

  • उदाहरण स्थिर फ़ील्ड के साथ लोड किया गया था मिल जाएगा कक्षा .. तो, उस चर के लिए किया गया कोई भी परिवर्तन हो सकता है इस उदाहरण भी के लिए उत्तरदायी होगा ..
+0

यह जवाब सही नहीं है, स्थिर चर संग्रहीत किया जा रहा है और क्रमबद्धता द्वारा बहाल। स्थिर चर नहीं कर सकते हैं और धारावाहिक नहीं हैं; स्थैतिक क्षेत्र का मूल्य कक्षा के क्षेत्र में पूरे समय रहता है ... यह कभी भी स्मृति को कभी नहीं छोड़ा। –

0

-Serialization तो de-क्रमबद्धता के दौरान बचाया राज्य आदेश में एक फिर से शुरू करने में इस्तेमाल किया जा सकता क्रमबद्धता दौरान वस्तु की राज्य को बचाने के लिए, प्रयोग किया जाता है ढेर पर समान वस्तु।

-हाँstatic चर serialized हो सकता है, लेकिन यह कोई मतलब नहीं है .....

2

MySerializable कक्षा की वर्तमान उत्पादन नीचे

x : 8, y :9 
x : 0, y :9 

है इस मामले में स्थैतिक चर टूस्ट्रिंग() विधि पर कॉल करने के बाद मुद्रित हो रहे हैं, इस समय तक यह कक्षा स्तर v से मूल्य पढ़ेगा ariable।

इस प्रयास करें:

//Serialize ब्लॉक के बाद MySerializable कक्षा में कोड की इस पंक्ति जोड़ें

AnotherClass.y = 5; 

उत्पादन होता है:

x : 8, y :9 
x : 0, y :5 

इसका मतलब यह स्थिर चर में संगृहीत कर रहा है फ़ाइल, यह toString() विधि द्वारा गतिशील रूप से पढ़ा जाएगा।

0

स्टेटिक चर नहीं हो सकते हैं और क्रमबद्ध नहीं किए जा सकते हैं।

आपका प्रश्न इस तथ्य पर आधारित प्रतीत होता है कि आप सीरियलाइजेशन के पहले क्रमिकरण के बाद स्थैतिक चर से समान मान देख रहे हैं, लेकिन यह क्रमबद्ध और बहाल होने वाले मूल्य के कारण नहीं है।

यह व्यवहार इसलिए है क्योंकि उस स्थैतिक चर के लिए स्थैतिक प्रारंभकर्ता इसे 9 तक सेट करता है, और यह कभी नहीं बदला जाता है।

सत्यापित करने के लिए कि स्थैतिक चर धारावाहिक नहीं कर रहे हैं, या तो आप NPKR के सुझाव परिवर्तन प्रदर्शन कर सकते हैं, क्रमबद्धता और अक्रमांकन के बीच स्थिर क्षेत्र को संशोधित करने, या आप निम्न कर सकता है:

भागो इस कार्यक्रम है, तो थोड़ा बाहर टिप्पणी जो क्रमबद्धता करता है। परिणामस्वरूप डिस्क पर आपके पुराने क्रमबद्ध संस्करण होंगे।

फिर स्थिर क्षेत्र के स्थिर प्रारंभकर्ता को y = 5 पर बदलें, और प्रोग्राम को फिर से चलाएं: आपको स्थिर क्षेत्र के 'x: 0 y: 5 as the output, because the value 9` को पुनर्स्थापित नहीं किया जाएगा।

0

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 
 

 

 
*/

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