2014-07-07 3 views
7

मैं इंटरफ़ेस Serializable की डॉक्स, जिसमें मैं निम्नलिखित लाइनों को खोजने पढ़ रहा हूँ:बेस क्लास (सीरियलज़ेबल को लागू नहीं करने) में कोई तर्क कन्स्ट्रक्टर नहीं होना चाहिए यदि इसका सबक्लास सीरियलज़ेबल लागू करता है?

गैर serializable वर्गों के उपप्रकार अनुमति देने के लिए धारावाहिक होने के लिए, उप-प्रकार की बचत और के राज्य को बहाल करने के लिए जिम्मेदारी मान सकते हैं supertype के सार्वजनिक, संरक्षित, और (यदि सुलभ) पैकेज फ़ील्ड। उप प्रकार यह ज़िम्मेदारी केवल तभी मान सकती है जब कक्षा के विस्तार में कक्षा के राज्य को शुरू करने के लिए एक सुलभ नो-Arg कन्स्ट्रक्टर होता है। यदि यह मामला नहीं है तो कक्षा सीरियलज़ेबल घोषित करने में त्रुटि है। रनटाइम पर त्रुटि का पता लगाया जाएगा।

लेकिन ऑब्जेक्ट की स्थिति को पुनर्स्थापित करने में बेस क्लास के नो-एर्ग कन्स्ट्रक्टर की भूमिका क्या है?

+0

देखें http://www.jguru.com/faq/view.jsp?EID=251942 – GKislin

उत्तर

13

जब आप एक धारावाहिक वस्तु को deserialize करने का प्रयास करते हैं, तो तंत्र को ऑब्जेक्ट का एक खाली उदाहरण बनाना होगा, और ऑब्जेक्ट को उस स्थिति में पुनर्स्थापित करने के लिए सदस्यों को भरना होगा जब यह धारावाहिक था। ऑब्जेक्ट का निर्माण पहली बार किया गया था जब एक धारावाहिक वस्तु का एक कन्स्ट्रक्टर बुलाया गया था, लेकिन निर्माता को deserialization के दौरान बुलाया नहीं जाता है, क्योंकि तकनीकी रूप से, आप वस्तु का निर्माण नहीं कर रहे हैं, बल्कि इसे पूर्व राज्य में पुनर्निर्माण कर रहे हैं। निर्माण और बाद में हेरफेर के किसी भी प्रभाव से ऑब्जेक्ट स्टेटस में पहले से ही शामिल होने की उम्मीद है।

जब भी आप किसी भी वर्ग का ऑब्जेक्ट बनाते हैं, जावा को सुपर क्लास के निर्माता और सुपर-सुपर-क्लास इत्यादि को कॉल करना होगा। आप super(...) का उपयोग कर सुपर क्लास के लिए एक विशिष्ट कन्स्ट्रक्टर निर्दिष्ट कर सकते हैं या यदि आप डॉन करते हैं एक सुपर कन्स्ट्रक्टर निर्दिष्ट नहीं है, डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग किया जाएगा। एक तरफ या दूसरा, जड़ के सभी वर्गों का निर्माण किया जाता है।

serlializable वस्तुओं की Deserialization निर्माता मंगलाचरण का कारण नहीं है, लेकिन जब वहाँ एक सुपर वर्ग कि serializable नहीं है, है तो उस वर्ग की उम्मीद नहीं है (कि तुम एक serializable वर्ग के साथ एक गैर serializable वर्ग का विस्तार है) deserialized हो, और इसके सदस्यों को भंडार/बहाल करने के लिए कोई तंत्र नहीं है। यदि सुपर क्लास धारावाहिक नहीं है, तो deserialization तंत्र को यह सुनिश्चित करने के लिए शून्य-तर्क कन्स्ट्रक्टर को कॉल करने की आवश्यकता है कि पुनर्निर्मित ऑब्जेक्ट इंस्टेंस सही ढंग से प्रारंभ किया गया हो।

यदि आप शून्य-तर्क कन्स्ट्रक्टर निर्दिष्ट करने में विफल रहते हैं, तो deserialization कोड आपको इस समस्या के बारे में चेतावनी नहीं देगा जब तक कि उस वर्ग की किसी ऑब्जेक्ट को deserialize करने का आपका प्रयास न हो। संकलन समय पर कोई चेतावनी नहीं है।

इसके अलावा, आपके serializable subclass को गैर-धारावाहिक सुपर क्लास से किसी भी सदस्य मान को संग्रहीत/बहाल करने की ज़िम्मेदारी लेनी चाहिए।

+0

बेस क्लास के निर्माता हमेशा क्रमबद्धता में चलते हैं? – YakRangi

+0

यदि सुपरक्लस धारावाहिक है तो कोई तर्क निर्माता की आवश्यकता नहीं है? क्योंकि व्युत्पन्न क्लास ऑब्जेक्ट स्वचालित रूप से बेस क्लास भाग को बचाएगा क्योंकि वह हिस्सा serializable है।] – YakRangi

+0

मान लीजिए कि क्या हमारे पास एक तर्क श्रेणी है जिसमें बेस क्लास में कोई तर्क नहीं है जो क्रमिक नहीं है, क्या वे दोनों को बुलाया जाता है? – YakRangi

0

यदि सुपर क्लास सबक्लास के ऑब्जेक्ट को क्रमबद्ध करने की तुलना में सीरियलज़ेबल नहीं है, तो हमें स्पष्ट रूप से उपclass में serializable इंटरफेस को लागू करना होगा। इस मामले में सुपरक्लास में इसमें कोई तर्क-तर्क नहीं होना चाहिए।

यदि सुपरक्लास सीरियलज़ेबल नहीं है तो सुपर क्लास से प्राप्त आवृत्ति चर के सभी मानों को deserialization प्रक्रिया के दौरान गैर-सीरियलज़ेबल सुपर क्लास के कन्स्ट्रक्टर को कॉल करके प्रारंभ किया जाएगा।

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