2009-06-09 19 views
16

मैं सीख रहा हूं कि Serializable का उपयोग कैसे करें।वास्तव में कौन सी धारावाहिक तरीकों को लागू करता है?

मुझे पता है कि मैं Serializable लागू करने वाले विभिन्न चर के साथ एक वर्ग 'ए' बनाता हूं और मैं अपनी कक्षा में Serializable जोड़ता हूं, यह Serializable भी है।

लेकिन, वास्तव में उन दो तरीकों को क्रमबद्ध करने के लिए कौन लागू कर रहा है? क्या Object आवश्यक होने पर सबकुछ या अलग-अलग वर्गों का ख्याल रखना उन्हें अधिभारित करता है?

उत्तर

15

धारावाहिक वास्तव में java.io.ObjectOutputStream (और java.io.ObjectInputStream) और इसके कुछ सहायक वर्गों में लागू किया गया है। कई मामलों में, यह अंतर्निहित समर्थन पर्याप्त है, और डेवलपर को मार्कर इंटरफ़ेस Serializable को लागू करने की आवश्यकता है। इस इंटरफेस को "मार्कर" कहा जाता है क्योंकि यह किसी भी तरीके की घोषणा नहीं करता है, और इस प्रकार कार्यान्वयन कक्षाओं पर किसी भी विशेष एपीआई की आवश्यकता नहीं होती है।

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

private void readObject(java.io.ObjectInputStream s) 
       throws java.io.IOException, java.lang.ClassNotFoundException 

क्रमबद्धता और अक्रमांकन पर पूर्ण नियंत्रण के लिए, लागू java.io.Externalizable बजाय Serializable

यदि आवश्यक हो तो जावा क्रमबद्धता में कई अन्य एक्सटेंशन पॉइंट हैं। serialization specification उन सभी के बारे में जानने के लिए एक आधिकारिक और पूर्ण स्रोत है।

+1

धन्यवाद। मुझे लगता है कि मुझे गलत समझा गया था। मैं वास्तव में क्या पूछ रहा था: यदि मेरी कक्षा धारावाहिक लागू करती है, जो धारावाहिक तरीकों को लागू करने का ख्याल रखती है। "... serialization वास्तव में java.io.ObjectOutputStream (और java.io.ObjectInputStream) और इसके कुछ सहायक वर्गों में लागू किया गया है ..." सही उत्तर की तरह दिखता है। धन्यवाद एरिक्सन! – Macarse

-1

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

आप ऑब्जेक्ट पर भरोसा नहीं कर सकते कि यह अनुमान लगाने में सक्षम हो कि आपकी कक्षा को सफलतापूर्वक क्रमबद्ध और deserialized क्या किया जाना चाहिए। उदाहरण के लिए अपनी कक्षा के काम करने वाले चर के बारे में सोचें, जिन्हें क्रमबद्ध करने की आवश्यकता नहीं है, ऑब्जेक्ट महत्वपूर्ण क्षेत्रों से उनको अलग करने में सक्षम नहीं होगा।

+2

यही क्षणिक कीवर्ड है: किसी ऑब्जेक्ट को क्रमबद्ध करते समय उन फ़ील्ड को छोड़ना। – Chochos

+1

डिफ़ॉल्ट क्रमबद्धता आमतौर पर क्या करना है इसके बारे में सही है। यदि वहां 'महत्वहीन' फ़ील्ड हैं, तो उन्हें अपनी ऑब्जेक्ट में क्यों भी रखें? – Jorn

+1

"क्या करना है" से आपका क्या मतलब है? –

7

मुझे लगता है कि आप जिन तरीकों के बारे में बात कर रहे हैं वे readObject() और writeObject() हैं। आपको केवल उनको लागू करने की आवश्यकता है यदि आपको कस्टम क्रमबद्ध करने की आवश्यकता है, उदाहरण के लिए जब आपके पास उस ऑब्जेक्ट में फ़ील्ड हैं जो क्रमिक नहीं हैं। यदि आपके पास केवल क्रमिक फ़ील्ड और प्राइमेटिव हैं, तो आपको कस्टम क्रमिकरण विधियों को लागू करने की आवश्यकता नहीं है। इसके अलावा, आप transient कीवर्ड जोड़कर क्रमिकरण पर कुछ फ़ील्ड छोड़ सकते हैं।

1

मुझे पता है कि मैं अलग-अलग चर के साथ एक वर्ग 'ए' बनाता हूं जो Serializable लागू करता है और मैं अपनी कक्षा में Serializable जोड़ता हूं, यह भी Serializable है।

हां, इस पल में आपकी कक्षा Serializable है।

+1

उद्धरण में 'अलग-अलग चर शामिल हैं जो Serializable लागू करते हैं' –

3

Serializable के API doc पर देखें, यह विस्तार से तंत्र को बताता है।

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

यदि आप पूर्ण नियंत्रण चाहते हैं, तो आप इसके बजाय Externalizable का उपयोग कर सकते हैं।

1

कक्षा के लिए धारावाहिक होने योग्य होने के लिए, उस वर्ग के सदस्य के रूप में निहित प्रत्येक वस्तु को भी क्रमिक होना चाहिए। जावा आपके द्वारा संदर्भित सभी वस्तुओं के वृक्ष को चलाएगा और बदले में उन्हें क्रमबद्ध करेगा।

आप कैसे वस्तुओं धारावाहिक हैं, तो आप Externalizable इंटरफ़ेस को लागू कर सकते हैं पर अधिक नियंत्रण करना चाहते हैं:

Externalizable इंटरफ़ेस का writeExternal और readExternal तरीकों एक वर्ग द्वारा कार्यान्वित किया जाता देने के लिए कक्षा पूर्ण नियंत्रण किसी ऑब्जेक्ट के लिए स्ट्रीम और उसके सुपरटिप्प्स के प्रारूप और सामग्री के प्रारूप पर।

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