2012-12-20 8 views
9

क्रमबद्धता:एक एंड्रॉइड बंडल का उपयोग करते समय, एक धारावाहिक ढेर एक ArrayList के रूप में deserialise क्यों करता है?

Bundle activityArguments = new Bundle(); 
Stack<Class<? extends WizardStep>> wizardSteps = new Stack<Class<? extends WizardStep>>(); 
     wizardSteps.push(CreateAlarmStep5View.class); 
     wizardSteps.push(CreateAlarmStep4View.class); 
     wizardSteps.push(CreateAlarmStep3View.class); 
     wizardSteps.push(CreateAlarmStep2View.class); 
     wizardSteps.push(CreateAlarmStep1View.class); 

     activityArguments.putSerializable("WizardSteps", wizardSteps); 

Deserialisation:

Stack<Class<? extends WizardStep>> wizardSteps = 
(Stack<Class<? extends WizardStep>>) getIntent().getExtras().getSerializable("WizardSteps"); 

अपवाद:

12-20 23: 19: 45.698: ई/AndroidRuntime (12145): की वजह से: java.lang.ClassCastException : java.util.ArrayList java.util पर नहीं डाला जा सकता है। स्टैक

उत्तर

10

इसकी ज्ञात bug है। मुझे आश्चर्य है कि यह अभी भी मौजूद है।

उपयोग सामान्य कंटेनर की तरह:

public class SerializableHolder implements Serializable { 
private Serializable content; 
public Serializable get() { 
    return content; 
} 
public SerializableHolder(Serializable content) { 
    this.content = content; 
} 
} 

आप GSON पुस्तकालय का उपयोग करते हैं, स्ट्रिंग के लिए अपने ढेर बदलने और क्रमानुसार बिना बंडल के लिए एक स्ट्रिंग के रूप में इस्तेमाल करते हैं। यह काम करना चाहिए।

+0

आपके उत्तर के लिए धन्यवाद। अंत में मैंने अभी एक सरणी सूची का उपयोग किया क्योंकि यह केवल पढ़ने के बाद तत्व को हटाने के लिए कोड की एक पंक्ति थी। स्टैक नौकरी के लिए सही उपकरण था, लेकिन एक सरणीसूची दूर नहीं थी! –

+0

यह एक अच्छा कामकाज है। – dmon

+0

** वेक्टर ** स्टैक की सुपर क्लास है - ArrayList नहीं। –

0

मुझे आशा है कि मैं कोई बकवास नहीं कर रहा हूं!

ढेर Serializable को लागू नहीं करता है बल्कि सिर्फ Serializable Vector जो ArrayList

मैं equivalent और कैसे ढीला है कि हो सकता है की असली परिभाषा के बारे में पता कर रहा हूँ के बराबर है फैली हुई है, लेकिन यह है कि पहले कहने के लिए पर्याप्त है स्टैक की सुपर क्लास जो सीरियलज़ेबल है वेक्टर है।

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

0

बस, serializable आप एक सूची के लिए बंडल से लिया गया डाली एक नया ढेर बनाते हैं और फिर ढेर करने के लिए सभी सूची आइटम जोड़ने:

Serializable serializable = savedInstanceState.getSerializable("key"); 
List<Something> arrayList = (List<Something>) serializable; 
Stack<Something> stack = new Stack<Something>(); 
stack.addAll(arrayList); 

सूची के लिए और आप से पूछना ArrayList नहीं क्यों डाली? क्योंकि अगर यह कुछ एंड्रॉइड संस्करण में तय किया गया है, तो आपके पास क्लासकास्ट अपवाद नहीं होगा।

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