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

なぜArrayListではなくListにキャストするのですか? これが一部の Android バージョンで修正された場合、ClassCastException が再度発生することはないためです。

于 2013-04-24T11:23:41.947 に答える
0

ナンセンスな話をしていないことを願っています!

Stack は Serializable を実装していませんが、SerializableVectorを拡張するだけです。ArrayList

の実際の定義とequivalent、それがどれほど緩いものかはわかりませんが、Serializable である Stack の最初のスーパークラスは Vector であると言えます。

この例外が表示されるので、おそらく、Serializable を ArrayList にキャストしても、この例外がスローされるべきではないと思います。そうでなければ、私はナンセンスな話をしています。

于 2012-12-20T23:46:29.867 に答える