2012-12-20 5 views
9

serializacji:Podczas korzystania z pakietu Android, dlaczego serializowany stos deserialise jako ArrayList?

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"); 

Wyjątek

12-20 23: 19: 45,698: E/Android Runtime (12145) spowodowane przez: java.lang.ClassCastException : java.util.ArrayList nie można przesłać do java.util.Stack

Odpowiedz

10

Jego znany bug. Zaskakuję, że wciąż istnieje.

zastosowania ogólnego pojemnika jak:

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

Jeśli używasz GSON biblioteki zamienić stos String i użyć jako jeden ciąg dla Bundle bez Serialize. Powinno działać.

+0

Dzięki za odpowiedź. Ostatecznie po prostu użyłem listy tablic, ponieważ oznaczało to jeden wiersz kodu do usunięcia elementu po przeczytaniu. Stack był odpowiednim narzędziem do pracy, ale lista układów nie była daleko! –

+0

To świetne rozwiązanie. – dmon

+0

** Vector ** to super klasa Stack - nie ArrayList. –

0

Mam nadzieję, że nie mówię żadnych bzdur!

Stos nie implementuje Serializable, ale raczej po prostu rozszerza Serializable Vector co jest równoważne ArrayList

jestem nieświadomy prawdziwej definicji equivalent i jak luźny to może być, ale wystarczy powiedzieć, że pierwszy super klasa Stack, która jest Serializable to Vector.

Ponieważ widzimy ten wyjątek, to prawdopodobnie założyłbym, że rzucanie Serializowalne do ArrayList nie powinno rzucać tego wyjątku. W przeciwnym razie mówię nonsens.

0

Wystarczy rzucać serializable ty pobierane z pakietu do listy, należy utworzyć nowy stos, a następnie dodać wszystkie elementy listy do stosu:

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

Dlaczego oddanych do listy i nie ArrayList pytasz? Ponieważ jeśli zostanie to naprawione w niektórych wersjach systemu Android, nie będziesz mieć ponownie wyjątku ClassCastException.

Powiązane problemy