2012-02-04 10 views
27

यदि मेरे पास बी विस्तारित है ... और ए लागू करता है Serializable, क्या मुझे "बी लागू Serializable" लिखना है?यदि मेरी कक्षा Serializable लागू करता है, तो क्या मुझे इसे अपने उप-वर्गों में लागू करना है?

मुझे कोई लगता है, लेकिन मैं पुष्टि करना चाहते हैं ...

भी अगर मैं एक में क्रमबद्धता आईडी डाल ... मैं भी बी में एक डाल की जरूरत है? ए में serialization आईडी सुरक्षित होना चाहिए (निजी नहीं)?

+2

नहीं snarky ध्वनि करने के लिए है, लेकिन यह कम समय सिर्फ इस कोशिश के लिए ले की तुलना में यह आप ले लिया इस सवाल लिखने के लिए होगा। –

+0

स्नैकी नहीं लगाना, लेकिन यह सलाह बहुत ही छोटी वेबसाइट होगी यदि वह सलाह लगातार ध्यान में रखी जाती है। –

उत्तर

15

हां। subclass स्पष्ट रूप से serializable चिह्नित नहीं किया जाना चाहिए।

और आईडी को चिह्नित करने के रूप में protected करेगा। (संकलक के नजरिए से)

लेकिन, अच्छा अभ्यास के रूप में हर वर्ग यह अपने निजी serialVersionUid

+0

धन्यवाद, कोई सीरियल संस्करण आईडी घोषित करने के बारे में पीले ग्रहण चेतावनी से छुटकारा पाने के लिए कोई विचार है? – ycomp

+0

परिभाषित करने के लिए और अधिक मजबूत तरीका 'निजी स्थिर अंतिम' – Azodious

+3

हां है। दस्तावेज़ों से "एक धारावाहिक वर्ग के सभी उपप्रकार स्वयं क्रमिक हैं।" http://download.java.net/jdk8/docs/api/java/io/Serializable.html – vsingh

3

नहीं, क्योंकि बी पहले से ही अपनी बेस क्लास ए के माध्यम से लागू करता है। यही वह विरासत है जो सभी के बारे में है।

8

अंकन आईडी के रूप में एक संकलक नजरिए से पर्याप्त होगा संरक्षित होना चाहिए। हालांकि, सिद्धांत रूप में, serialVersionUID फ़ील्ड का बिंदु Serializable वर्ग पर वर्ग को वर्ग के "संस्करण" को आसानी से अलग करना है - यह स्पष्ट रूप से इंगित करना है कि किसी दिए गए ऑब्जेक्ट को प्रदत्त वर्ग के उदाहरण में deserialized किया जा सकता है (यदि serialVersionUID एस अलग हैं, एक अपवाद फेंक दिया गया है)। यदि आप किसी ऑब्जेक्ट के संस्करणों और प्रकृति को स्पष्ट रूप से ट्रैक करने में सक्षम होना चाहते हैं, तो प्रत्येक उपclass पर serialVersionUID घोषित करें।

+0

मुझे लगता है कि वर्ग में परिवर्तन की पहचान करने के लिए जेवीएम के लिए 'serialVersionUIDs' घोषित किया गया है। और जेवीएम इसे बेस क्लास से प्राप्त कर सकता है, इसलिए इससे कोई फर्क नहीं पड़ता है। – Azodious

+0

वैसे हाँ, लेकिन मेरा मुद्दा वास्तव में था, serialVersionUID को उस परेशानी के रूप में न मानें जिसे आप छुटकारा पाने की कोशिश कर रहे हैं। जानें कि यह क्यों है और उचित तरीके से इसका इलाज करें। –

+0

हां, लेकिन हमारे पास समान 'serialVersionUID' के साथ दो अलग-अलग कक्षाएं हो सकती हैं। अगर यह स्पष्ट रूप से किसी वर्ग को विस्तारित किए बिना एक साधारण वर्ग था, तो यह अनिवार्य होना चाहिए। – Azodious

7

@azodious उत्तर के लिए मेरे अनुबंध में, बाल वर्ग को मूल वर्ग के क्रमिक गुण प्राप्त होते हैं, लेकिन आपको धारावाहिक VERSIONUID स्पष्ट रूप से घोषित करना होगा।

जावा डॉक्स से: https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

यह भी दृढ़ता से सलाह दी जाती है कि स्पष्ट serialVersionUID घोषणाओं, निजी संशोधक जहां संभव का उपयोग के बाद से इस तरह के घोषणाओं केवल तुरंत घोषित करने वर्ग के लिए लागू होते हैं - serialVersionUID क्षेत्र हैं विरासत सदस्यों के रूप में उपयोगी नहीं है।

8

आपको सीरियलज़ेबल के रूप में व्युत्पन्न रूप से चिह्नित करने की आवश्यकता नहीं है, इसे विरासत में मिलाया जाएगा। हालांकि, अभिभावक से serialVersionUID, हालांकि विरासत में, serialization प्रक्रिया द्वारा उपयोग नहीं किया जाएगा। यदि आप बच्चे को एक serialVersionUID नहीं जोड़ते हैं तो एक उत्पन्न होगा।

नीचे देखें:

public class A implements Serializable { 
    protected static final long serialVersionUID = 1L; 
} 

public class B extends A { 
} 

public class Main { 

    public static void main(String[] args){ 

     A a = new A(); 
     B b = new B(); 

     Class aClass = a.getClass(); 
     Class bClass = b.getClass(); 

     long aUid = ObjectStreamClass.lookup(aClass).getSerialVersionUID(); 
     long bUid = ObjectStreamClass.lookup(bClass).getSerialVersionUID(); 

     System.out.printf("serialVersionUID:\n"); 
     System.out.printf("b inherited from a: %d\n", b.serialVersionUID); 
     System.out.printf("a used by serialization: %d\n",aUid); 
     System.out.printf("b used by serialization: %d\n",bUid); 
    } 

} 

आउटपुट:

serialVersionUID: 1

एक क्रमबद्धता द्वारा इस्तेमाल किया: 1

ख इस्तेमाल किया

ख एक से विरासत में मिली serialization द्वारा: -367523 2183873847366

3

एक जावा ऑब्जेक्ट धारावाहिक है यदि इसकी कक्षा या उसके किसी भी सुपरक्लास या तो java.io लागू करता है।Serializable इंटरफेस या इसके subinterface, java.io.Externalizable।

आप आधिकारिक दस्तावेज पर एक नज़र ले जा सकते हैं और इस लगता है: https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html

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