2012-07-22 13 views
31

संभव डुप्लिकेट:
Why Java needs Serializable interface?Java.lang.Object Serializable इंटरफ़ेस को लागू क्यों नहीं करता है?

Serializability के अनुसार जावा डॉक्स में:

एक वर्ग के Serializability वर्ग java.io.Serializable को लागू करने से सक्षम किया गया है इंटरफेस। कक्षाएं जो इंटरफ़ेस को लागू नहीं करती हैं, उनमें से कोई भी राज्य क्रमबद्ध या deserialized नहीं होगा। एक धारावाहिक वर्ग के सभी उपप्रकार स्वयं क्रमिक हैं। क्रमबद्धता इंटरफ़ेस कोई तरीकों या फ़ील्ड होते हैं और के लिए एक ही कार्य करता है serializable जा रहा है

क्यों वस्तु पहले से ही Serializable को लागू नहीं करता है के शब्दों की पहचान? सदस्य जिन्हें हम क्रमबद्ध नहीं करना चाहते हैं उन्हें transient के रूप में बनाया जा सकता है। डिफ़ॉल्ट Serializability क्यों रोकें?

+2

[यह प्रश्न] (http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface) में कुछ अच्छे उत्तर हैं जो आपकी रुचि ले सकते हैं। वास्तव में – Pshemo

+0

। मुझे पोस्ट करने से पहले वैकल्पिक कीवर्ड का प्रयास करना चाहिए था :) –

उत्तर

40

एक धारावाहिक वर्ग के सभी उपप्रकार स्वयं क्रमिक हैं।

दूसरे शब्दों में: सभी कक्षाएं आप कभी भी बनाते हैं, तो थे या बनाया जाएगा सभी serializable कर रहे हैं। transient केवल पूरे वर्गों में फ़ील्ड को छोड़ देता है।

यह एक संभावित सुरक्षा छेद है - संयोग से आप क्रमबद्ध कर सकते हैं उदा। आपके DataSource डेटाबेस प्रमाण-पत्रों के साथ - यदि इस विशेष DataSource कार्यान्वयन के निर्माता ऐसे फ़ील्ड transient बनाने के लिए भूल गए हैं। यादृच्छिक जावा ऑब्जेक्ट को क्रमबद्ध करना आश्चर्यजनक रूप से आसान है, उदा। बाहरी this के निहित संदर्भ वाले आंतरिक वर्गों के माध्यम से।

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

इसके अलावा आप अब नहीं कह सकते: MySuperSecretClass क्रमिक नहीं है (बस Serializable लागू नहीं कर रहा है) - आप केवल गड़गड़ाहट (फ़ील्ड) को बाहर कर सकते हैं।

+0

ठीक है, मुझे लगता है कि मैं इसके सुरक्षा पहलू को पूरी तरह याद कर चुका हूं। समझ में आता है। लेकिन क्या हम समय-समय पर संकलन के लिए निजी/सार्वजनिक/संरक्षित का उपयोग नहीं करते हैं? क्षणिक नहीं हो सकता है या कुछ इसी तरह रन टाइम के लिए जनादेश बनाया जा सकता है? सिर्फ पूछ रहे। या यह सिर्फ बोझिल होगा। –

+3

@ टीजे-: आईएमएचओ कक्षाओं के केवल एक छोटे से हिस्से को धारावाहिक (मूल्य वस्तुएं, डीटीओ) होना चाहिए। धारावाहिक होने की आवश्यकता वाले वर्गों को चिह्नित करना अधिक सुविधाजनक है जो उनको चिह्नित करते हैं जो इसे साफ़ नहीं करते हैं। यह नहीं कि जावा उन मामलों में बोझिल नहीं है: फिर से IMHO सभी फ़ील्ड निजी हो सकते हैं और डिफ़ॉल्ट रूप से सभी विधियां सार्वजनिक हो सकती हैं, लेकिन आप क्या कर सकते हैं? –

5

अधिकांश कक्षाओं को क्रमबद्ध करने की आवश्यकता नहीं है। वर्तमान डिजाइन के साथ आप आसानी से ध्यान दे सकते हैं कि कक्षा क्रमबद्ध है। अनिवार्य रूप से यह सिर्फ एक कंपाइलर-जांच स्वयं-दस्तावेज है। अन्यथा आप शायद कुछ लिखेंगे:

/** DON'T SERIALIZE IT!!! */ 
class Connection { ... } 

और टिप्पणियों की तुलना में भाषा या पुस्तकालय सुविधा होना बेहतर है।

1

मैं इसे जिन वस्तुओं पर कायम किया जाना है और वर्ग transiennt के हर क्षेत्रों घोषित अधिक बोझिल हो जाएगा की जरूरत के लिए Serializable लागू करने के लिए और अधिक समझ में आता है लगता है। एक और बिंदु जिसके लिए मुझे यकीन नहीं है कि Object सभी वर्गों की जड़ है, जिसमें प्रतिबिंब से संबंधित वर्ग शामिल हैं, इसलिए ऑब्जेक्ट क्लास के लिए सीरियलज़ेबल को लागू करना अनुचित होगा।

13

1।Serializableमार्कर इंटरफ़ेस, जो खाली है, लेकिन जब एक वर्ग को Serializable चिह्नित किया जाता है जिसका अर्थ है कि इसकी वस्तुएं Serializable हैं।

2. कारण java.lang.Object फ्लॉप Serializable लागू है, क्योंकि, क्या हुआ अगर आप ऐसा नहीं कर Serializable के रूप में कुछ क्षेत्रों बनाने के लिए चाहते हैं और आप अपनी गलती है कि क्षेत्र के लिए क्षणिक जोड़ने के लिए याद किया, तो एक हो जाएगा कहर।

3. प्रोग्रामर अपने वर्ग के लिए Serializable को लागू करने से, यह प्रोग्रामर है कि वह जानबूझकर इसे लागू किया गया है, और आवश्यक कदम उठाने जो नहीं होना चाहिए धारावाहिक जा करने के लिए कुछ भी रोकने के लिए चाहिए के बीच में जागरूकता बनाता है।

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