10

序列化:

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

反序列化:

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

例外:

12-20 23:19:45.698:E/AndroidRuntime(12145):原因:java.lang.ClassCastException:java.util.ArrayList 无法转换为 java.util.Stack

4

3 回答 3

11

它的已知错误。我很惊讶它仍然存在。

使用通用容器,例如:

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

如果您使用GSON库,请将您的堆栈转换为字符串并用作捆绑的单个字符串而无需序列化。它应该工作。

于 2012-12-20T23:45:57.723 回答
3

只需将您从包中检索到的可序列化转换为列表,创建一个新堆栈,然后将所有列表项添加到堆栈中:

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

为什么要投射到 List 而不是 ArrayList 你问?因为如果这在某些 Android 版本中得到修复,您将不会再次出现 ClassCastException。

于 2013-04-24T11:23:41.947 回答
0

我希望不是在胡说八道!

Stack 没有实现 Serializable ,而只是扩展了 Serializable Vector,相当于ArrayList

我不知道它的真正定义equivalent以及它的松散程度,但只要说可序列化的 Stack 的第一个超类是 Vector 就足够了。

既然我们看到了这个异常,那么我可能会假设将 Serializable 转换为 ArrayList 不应该抛出这个异常。否则,我是在胡说八道。

于 2012-12-20T23:46:29.867 回答