При использовании пакета android, почему сериализованный стек десериализуется как 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

Solutions Collecting From Web of "При использовании пакета android, почему сериализованный стек десериализуется как ArrayList?"

Его известная ошибка . Я удивляюсь, что он все еще существует.

Используйте общий контейнер, например:

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

Если вы используете библиотеку GSON , конвертируйте Stack в String и используйте как одиночную String для Bundle без Serialize. Он должен работать.

Надеюсь, я не говорю ничего глупостей!

Stack не реализует Serializable, а скорее расширяет Serializable Vector что эквивалентно ArrayList

Я не знаю реального определения equivalent и того, насколько это возможно, но достаточно сказать, что первый суперкласс Stack, который является Serializable, является Vector.

Поскольку мы видим это исключение, то я, вероятно, предположил бы, что отбрасывание Serializable в ArrayList не должно вызывать это исключение. В противном случае я говорю глупости.

Просто отрисуйте сериализуемую информацию, полученную из пакета, в список, создайте новый стек и добавьте все элементы списка в стек:

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

Зачем бросать в List, а не ArrayList, который вы спрашиваете? Потому что, если это исправлено в некоторых версиях Android, у вас снова не будет ClassCastException.