2010-02-18 11 views
176

मेरे पास शीर्षक में दिया गया चेतावनी संदेश है। मैं इसे समझना और हटाना चाहता हूं। मुझे इस प्रश्न पर पहले से ही कुछ जवाब मिले हैं लेकिन तकनीकी शर्तों के साथ अधिभार के कारण मुझे इन उत्तरों को समझ में नहीं आता है। क्या सरल शब्दों के साथ इस मुद्दे को समझाना संभव है?इसका क्या अर्थ है: धारावाहिक वर्ग स्थिर स्थिर धारावाहिक VERSIONUID फ़ील्ड घोषित नहीं करता है?

पीएस मुझे पता है कि ओओपी क्या है। मुझे पता है वस्तु, वर्ग, विधि, क्षेत्र और तत्काल क्या है।

पी.पी.एस. किसी ने मेरी कोड की जरूरत है इसे यहाँ है:

import java.awt.*; 
import javax.swing.*; 


public class HelloWorldSwing extends JFrame { 

     JTextArea m_resultArea = new JTextArea(6, 30); 

     //====================================================== constructor 
     public HelloWorldSwing() { 
      //... Set initial text, scrolling, and border. 
      m_resultArea.setText("Enter more text to see scrollbars"); 
      JScrollPane scrollingArea = new JScrollPane(m_resultArea); 
      scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5)); 

      // Get the content pane, set layout, add to center 
      Container content = this.getContentPane(); 
      content.setLayout(new BorderLayout()); 
      content.add(scrollingArea, BorderLayout.CENTER); 
      this.pack(); 
     } 

     public static void createAndViewJFrame() { 
      JFrame win = new HelloWorldSwing(); 
      win.setTitle("TextAreaDemo"); 
      win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      win.setVisible(true); 
     } 

     //============================================================= main 
     public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable(){ 
       public void run(){ 
        createAndViewJFrame(); 
       } 
      }); 
     } 

} 
+0

क्या यह हो सकता है कि चर्चा की गई चेतावनी संदेश एक कारण है कि मेरा जीयूआई आवेदन स्थिर हो गया है? – Roman

+0

नहीं, आपके गुई ठंड के साथ कुछ भी नहीं करना है। – james

+2

डुप: http://stackoverflow.com/questions/285793/why-should-i-bother-about-serialversionuid – skaffman

उत्तर

132

javadoc से:

प्रत्येक serializable वर्ग के साथ

क्रमबद्धता क्रम सहयोगियों एक संस्करण संख्या, एक serialVersionUID, जो अक्रमांकन दौरान प्रयोग किया जाता है की पुष्टि है कि कहा जाता है एक धारावाहिक वस्तु के प्रेषक और रिसीवर ने उस वस्तु के लिए कक्षाएं लोड की हैं जो क्रमबद्धता के संबंध में संगत हैं। अगर रिसीवर ने उस ऑब्जेक्ट के लिए एक वर्ग लोड किया है जिसमें संबंधित प्रेषक वर्ग की तुलना में serialVersionUID अलग है, तो deserialization के परिणामस्वरूप InvalidClassException होगा। एक serializable वर्ग घोषणा कर सकते हैं अपनी ही serialVersionUID स्पष्ट "serialVersionUID" नाम के एक क्षेत्र है कि, स्थिर अंतिम, और के प्रकार का होना चाहिए की घोषणा के द्वारा:

आप करने के लिए अपने आईडीई कॉन्फ़िगर कर सकते हैं:

  • इस पर ध्यान न दें, बजाय चेतावनी देने का
  • autogenerate एक आईडी

आपके अतिरिक्त प्रश्न के अनुसार "यह हो सकता है कि चर्चा की चेतावनी संदेश एक कारण है कि मेरी जीयूआई आवेदन फ्रीज है?":

नहीं, यह नहीं हो सकता। यह केवल एक समस्या का कारण बन सकता है यदि आप ऑब्जेक्ट्स को क्रमबद्ध कर रहे हैं और उन्हें एक अलग स्थान (या समय) में deserializing जहां (कब) कक्षा बदल गई है, और यह ठंड में परिणाम नहीं होगा, लेकिन InvalidClassException में।

+7

आप अपने आईडीई को स्वत: उत्पन्न करने के लिए भी दे सकते हैं। – BalusC

+4

@ बाल्लूसी - हम ग्रहण में ऐसा कैसे कर सकते हैं? क्या यह स्वचालित उत्पन्न करने के लिए सुरक्षित है? –

+4

@JediKnight Eclispse में यह विंडो> प्राथमिकताएं> जावा> कोड शैली> साफ़ करें> अनुपलब्ध कोड> "संभावित प्रोग्रामिंग समस्याओं" के अंतर्गत "धारावाहिक संस्करण आईडी जोड़ें" सक्रिय करें। फिर यदि आप डिफ़ॉल्ट प्रोफ़ाइल में हैं, तो जाहिर है कि आपको इसे एक अलग के रूप में सहेजना होगा। – 0x41414141

5

कोई भी वर्ग जिसे धारावाहिक किया जा सकता है (यानी Serializable लागू करता है) को यह घोषणा करनी चाहिए कि जब भी कुछ बदलाव होता है तो इसे बदलना चाहिए (सीरियलाइजेशन (अतिरिक्त फ़ील्ड, हटाए गए फ़ील्ड, फ़ील्ड ऑर्डर में परिवर्तन, ...) को प्रभावित करता है। क्षेत्र का मान deserialization के दौरान चेक किया गया है और यदि धारावाहिक वस्तु का मूल्य वर्तमान वीएम में कक्षा के मूल्य के बराबर नहीं है, तो एक अपवाद फेंक दिया जाता है।

ध्यान दें कि यह मान विशेष है कि यह ऊपर वर्णित कारणों के लिए ऑब्जेक्ट के साथ क्रमबद्ध है, भले ही यह स्थिर है।

+2

मैं एक धारावाहिक वर्ग JFrame? यूआईडी क्या है और मैं इसे कैसे घोषित कर सकता हूं? क्या मेरा कोड "कुछ ऐसा बदलता है जो क्रमबद्धता को प्रभावित करता है"? वास्तव में serialization का मतलब क्या है? – Roman

+0

हां, जेएफआरएम एक java.awt.Component है जो Serializable लागू करता है। संहिता किसी भी चीज को कभी भी बदलती नहीं है जो क्रमिकरण को प्रभावित करती है, केवल प्रोग्रामर ही ऐसा करते हैं। मुझे ऐसी सूची नहीं पता है जो क्रमिकरण को प्रभावित करने वाले सभी परिवर्तनों को सूचीबद्ध करता है। जावा में क्रमबद्धता के विवरण के लिए http://en.wikipedia.org/wiki/Serialization#Java देखें। –

+2

यह वस्तु के साथ क्रमबद्ध नहीं है। इसे तब तक बदला नहीं जाना चाहिए जब तक कि आप संगतता को तोड़ना नहीं चाहते हैं, या यदि आपने पहले से ही विनिर्देश के संस्करण अनुभाग में जो कहा है उससे प्रस्थान करके ऐसा किया है। इसमें फ़ील्ड जोड़ने या पुन: व्यवस्थित करना शामिल नहीं है। सही संदर्भ विकिपीडिया नहीं है लेकिन ऑब्जेक्ट सीरियलाइजेशन विशिष्टता है। – EJP

31

चेतावनी के कारण here दस्तावेज किए गए हैं, और सरल फिक्स चेतावनी को बंद करना या संस्करण यूआईडी की आपूर्ति के लिए आपके कोड में निम्नलिखित घोषणा करना है। वास्तविक मान प्रासंगिक नहीं है, यदि आप चाहें तो 999 से शुरू करें, लेकिन जब आप कक्षा में असंगत परिवर्तन करते हैं तो इसे बदलना।

public class HelloWorldSwing extends JFrame { 

     JTextArea m_resultArea = new JTextArea(6, 30); 
     private static final long serialVersionUID = 1L; 
+1

चेतावनी के कारण जावा ऑब्जेक्ट सीरियलाइजेशन स्पेसिफिकेशन और [जावाडोक] (http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html) में दस्तावेज किए गए हैं। StackOverflow उत्तर मानक संदर्भ नहीं हैं। – EJP

27

यह परिवर्तित किया जाना चाहिए, जब भी कुछ भी परिवर्तन क्रमबद्धता (अतिरिक्त फ़ील्ड, हटाया क्षेत्रों, क्षेत्र के आदेश के परिवर्तन प्रभावित करता है, ...)

यह सही नहीं है, और आप उस दावे के लिए एक आधिकारिक स्रोत उद्धृत करने में असमर्थ होंगे। यह बदला जाना चाहिए जब भी आप एक परिवर्तन यह है कि Object Serialization Specification की Versioning of Serializable Objects अनुभाग, जो विशेष रूप नहीं अतिरिक्त फ़ील्ड या फ़ील्ड आदेश, और के परिवर्तन शामिल हैं जब आप readObject(), writeObject(), प्रदान नहीं की है और करता है में दिए गए नियमों के तहत असंगत है बनाना/या readResolve() या /writeReplace() विधियों और/या serializableFields घोषणा जो परिवर्तन से निपट सकती है।

30

अन्य उत्तरों में अब तक बहुत सारी तकनीकी जानकारी है। सरल शब्दों में, अनुरोध के अनुसार, मैं उत्तर देने का प्रयास करूंगा।

सीरियलाइजेशन आप किसी ऑब्जेक्ट के उदाहरण के लिए करते हैं यदि आप इसे कच्चे बफर में डंप करना चाहते हैं, इसे डिस्क पर सहेजें, इसे बाइनरी स्ट्रीम में ट्रांसपोर्ट करें (उदाहरण के लिए, नेटवर्क सॉकेट पर ऑब्जेक्ट भेजना), या अन्यथा किसी ऑब्जेक्ट का क्रमबद्ध बाइनरी प्रतिनिधित्व बनाएं। (Serialization पर अधिक जानकारी के लिए Java Serialization on Wikipedia देखें)।

यदि आपके पास अपनी कक्षा को क्रमबद्ध करने का कोई इरादा नहीं है, तो आप अपनी कक्षा @SuppressWarnings("serial") से ऊपर एनोटेशन जोड़ सकते हैं।

यदि आप धारावाहिक करने जा रहे हैं, तो आपके पास UUID के उचित उपयोग के आसपास केंद्रित सभी के बारे में चिंता करने के लिए कई चीजें हैं। असल में, यूयूआईडी एक ऐसा ऑब्जेक्ट "संस्करण" का एक तरीका है जिसे आप क्रमबद्ध करेंगे ताकि जो भी प्रक्रिया डी-सीरियलाइजिंग हो, वह जानता है कि यह सही ढंग से डी-सीरियलाइजिंग कर रहा है। मैं अधिक जानकारी के लिए Ensure proper version control for serialized objects पर देखता हूं।

+0

आपके उद्धरण में कई * प्रमुख * गलतियां हैं, और कुछ आत्म-विरोधाभास भी हैं। – EJP

+11

@EJP यदि आप त्रुटियों की गणना करते हैं तो यह सभी के लिए उपयोगी होगा। – MrMas

+0

@EJP यह सिर्फ मेरे लिए हुआ कि मेरे उत्तर में दो उद्धरण हैं। आप किस उद्धरण का जिक्र कर रहे हैं? – MrMas

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