2011-02-07 19 views
28

यह क्यों है कि java.util.ListSerializable लागू नहीं करता है जबकि उप-वर्ग LinkedList, Arraylist करते हैं? क्या यह विरासत सिद्धांतों के खिलाफ नहीं लगता है? हमारे पास स्पष्ट रूप से कहने के लिए LinkedList l = (LinkedList)objectInputStream.readObject(); बजाय List l = (List)objectInputStream.readObject(); दूसरी तरफ वस्तु पढ़नेjava.util.List Serializable लागू क्यों नहीं करता है?

new ObjectOutputStream(some inputStream).writeObject(some LinkedList); 

अब तक तो अच्छा है, लेकिन, जबकि उदाहरण के लिए: अगर हम एक नेटवर्क पर एक LinkedList भेजना चाहते हैं, हम लिखने के लिए की है। अगर हम LinkedList से ArrayList कहने के लिए लेखन कार्यक्षमता को कभी भी बदलना चाहते थे, तो हमें पढ़ने के हिस्से को भी बदलना होगा। List लागू करने के बाद Serializable समस्या हल हो गई होगी।

+2

मुझे नहीं लगता कि आपके कथन का दूसरा भाग सटीक है, न कि मुझे इसे आजमाने का मौका मिला है। आपको किस तरह की त्रुटियां मिल रही हैं? –

उत्तर

35

ListSerializable लागू नहीं करता है क्योंकि यह सूची के लिए एक महत्वपूर्ण आवश्यकता नहीं है। कोई गारंटी नहीं है (या आवश्यकता है) कि List के हर संभव कार्यान्वयन को क्रमबद्ध किया जा सकता है।

LinkedList और ArrayList ऐसा करने का चयन करें, लेकिन यह उनके कार्यान्वयन के लिए विशिष्ट है। अन्य List कार्यान्वयन Serializable नहीं हो सकते हैं।

+2

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

+10

एक सूची के सभी कार्यान्वयन को क्रमबद्ध करने के लिए मजबूर करने में एक अंतर है, और यह चुनकर कि एक विशेष कार्यान्वयन क्रमबद्ध है। –

+1

लिंक्डलिस्ट एक कार्यान्वयन है, जिसके लिए डेवलपर्स धारावाहिक संपत्ति देने का विकल्प चुनते हैं। अगर हम आपके तर्क का पालन करते हैं तो किसी भी कक्षा को दो इंटरफेस को एक समय में लागू नहीं करना चाहिए ... – Dunaril

3

क्योंकि List उपयोगकर्ता विशिष्ट उप-वर्गों द्वारा भी लागू किया जा सकता है, और कार्यान्वयनकर्ता Serializable को लागू नहीं करना चाहते हैं। Serializability List की प्रमुख जिम्मेदारियों से संबंधित नहीं है, इसलिए दोनों को एक साथ जोड़ने का कोई कारण नहीं है।

7

सूची एक इंटरफ़ेस है और इसे विस्तारित करने से Serializable का अर्थ यह होगा कि सूची का कोई भी कार्यान्वयन क्रमिक होना चाहिए।

क्रमिक संपत्ति सूची सार तत्व का हिस्सा नहीं है और इसलिए इसे कार्यान्वयन के लिए आवश्यक नहीं होना चाहिए।

1

परिकल्पना ThreadList implements List<Thread> पर विचार करें, जिसमें किसी भी समय दिए गए सक्रिय थ्रेड की सूची शामिल है। कार्यान्वयन पारदर्शी रूप से सक्रिय धागे को ब्राउज़ करता है और आपकी सुविधा के लिए - उन्हें आसानी से पहुंच प्रदान करता है। क्या ऐसा कार्यान्वयन serializable होना चाहिए (भूलना कि Thread serializable नहीं है)?

यह तय करने के लिए इंटरफेस को लागू करने वाले व्यक्ति पर निर्भर करता है कि क्या उसके कार्यान्वयन को क्रमबद्ध करने के लिए सुरक्षित है या नहीं। List बहुत सामान्य है, मूल रूप से * प्रकार टी के प्रकार के ऑर्डर संग्रह के रूप में बता रहा है।

3

नहीं। एक लिंक्डलिस्ट हमेशा एक सूची है। जब आप लिंक्ड सूची deserialize, के बाद से एक LinkedList एक सूची है, तो आप

List l = (List) objectInputStream.readObject(); 

तथ्य यह है कि एल वास्तव में एक LinkedList है महत्वपूर्ण नहीं है लिख सकते हैं। आप एक सूची चाहते थे, और आपको एक सूची मिली।

+0

क्या आप निश्चित हैं? रनटाइम कैसे समझता है कि ऑब्जेक्ट को deserialize कैसे करें यदि आप इसे एक गैर धारावाहिक इंटरफ़ेस में डालते हैं? – Dunaril

+1

कास्ट deserialization के बाद होता है और इस प्रकार यहां महत्वपूर्ण नहीं है -> सूची में डाला ठीक है – Puce

+3

रनटाइम जानता है कि ऑब्जेक्ट को कैसे व्यवस्थित करना है क्योंकि इसकी धारावाहिक बाइट स्ट्रीम में उस ऑब्जेक्ट के वर्ग का नाम होता है जिसे क्रमबद्ध किया गया है। ObjectInputStream इस प्रकार इस वर्ग का एक उदाहरण बनाता है और धारावाहिक वस्तु में पाए गए डेटा के साथ इसे पॉप्युलेट करता है, और उसके बाद इसे कॉलर पर लौटाता है। कॉलर जानता है कि यह एक सूची थी जिसे क्रमबद्ध किया गया था, और इस प्रकार लौटाई गई वस्तु को एक सूची में रखता है। –

-2

सूची संग्रह फैली हुई है, और यह कुछ भी लागू नहीं कर सकते, क्योंकि यह एक अंतरफलक है ...

+3

संभावित रूप से ओपी का मतलब था कि 'सूची' को 'संग्रह' के साथ 'सीरियलज़ेबल * * बढ़ाया जाना चाहिए, तथ्य यह है कि उन्होंने शब्द लागू करने का उपयोग संदर्भ में समझा जाना चाहिए ... – davin

0

सूची को लागू करता है/Serializable फैली तो आप अनुबंध है कि सभी कार्यान्वयन वर्गों/सूची के उपवर्गों भी Serializable हैं निहित है जो हमेशा सच नहीं है। उदाहरण के लिए ForwardingListMultimap के अमरूद-संग्रह कार्यान्वयन को देखें। इसे क्रमिक रूप से Serializable होने की आवश्यकता नहीं है और यह केवल इसलिए संभव था क्योंकि सूची Serializable नहीं है।

0

ऐसा क्यों है कि java.util.List Serializable को लागू नहीं करता है ...

क्योंकि दुनिया में नहीं हर List कार्यान्वयन Serializable होना चाहिए।

दूसरी तरफ हम स्पष्ट रूप से कहना है पर वस्तु को पढ़ने के दौरान ...

List l = (List) objectInputStream.readObject(); 

के बजाय आप इसे की कोशिश की? यदि आप करते हैं, तो मुझे लगता है कि आप पाएंगे कि यह काम करता है।

1

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

लेकिन भले ही इन पैरामीटर और वापसी प्रकार Serializable, आप विशिष्ट कार्यान्वयन प्रकार पता करने की जरूरत नहीं होगी गया:

ObjectOutputStream stream = ...; 
List myList = ...; 
stream.writeObject((Serializable)myList); 

और

ObjectInputStream stream = ...; 
List myList = (List) stream.readObject(); 

रूप में अच्छी तरह काम करेगा के रूप में यह अब काम करता है (Serializable कलाकार के बिना)।

ऑब्जेक्ट इनपुटपुट स्ट्रीम और ऑब्जेक्टऑटपुटस्ट्रीम आपके प्रकार के बारे में बिल्कुल परवाह नहीं करते हैं, वे आसानी से हाथ और उसकी कक्षा में ऑब्जेक्ट देखते हैं।

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