2012-12-20 23 views
9

シリアライズ:アンドロイドバンドルを使用すると、なぜシリアル化されたスタックは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); 

デシリアライゼーション:

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にキャストできません

答えて

10

既知のbugです。私はまだそれが存在することを驚かせている。以下のよう

使用汎用コンテナ:あなたはGSONライブラリを使用する場合

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

は、Stringにあなたのスタックを変換し、シリアル化せずにバンドルするための単一の文字列として使用します。それは動作するはずです。

+0

あなたの答えをありがとう。最後に、私はarraylistを使用しました。それは、要素が読み込まれた後にその要素を削除するというコードの1行を意味していました。スタックは、仕事のための適切なツールだったが、arraylistは遠くない! –

+0

これはすばらしい回避策です。 – dmon

+0

** Vector **はStackListのスーパークラスであり、ArrayListではありません。 –

0

私はナンセンスを話していないといいですね!

スタックはSerializableを実装していないのではなく、単にArrayList

に相当するSerializableをVectorを拡張し、私は本当のequivalentの定義とどのように緩んでそれは可能性に気づいていないけど、最初のことを言うのに十分です直列化可能なスタックのスーパークラスはVectorです。

この例外があるので、おそらく、SerializableをArrayListにキャストしてもこの例外はスローされないはずです。それ以外の場合、私はナンセンスを話している。

0

はちょうどあなたが新しいスタックを作成し、リストにバンドルから取得した後、スタックにすべてのリスト項目を追加し、シリアライズをキャスト:

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

は、なぜあなたは尋ねるArrayListの一覧を表示していないためにキャスト?これは、Androidの一部のバージョンでこれが修正された場合、ClassCastExceptionを再度持たないためです。

関連する問題