Weird ClassCastException при десериализации в onRestoreInstanceState

В onSaveInstanceState() :

 // departures is instance of Departures which extends ArrayList bundle.putSerializable("departures", departures); 

В onRestoreInstanceState :

 departures = (Departures) state.getSerializable("departures"); 

Когда я поворачиваю экран, активность перезапускается, и состояние восстанавливается. Он работает нормально. Если я покину мероприятие, через некоторое время Android удалит его из памяти и сохранит его состояние. Когда я вернусь к нему, он сбой в onRestoreInstanceState :

 java.lang.ClassCastException: java.util.ArrayList cannot be cast to cz.fhejl.pubtran.Departures 

Теперь getSerializable возвращает ArrayList , а не Departures .

Редактировать: вот как выглядит Departures.java: http://pastebin.com/qc3QfrK7

Проблема, которую вы видите, вызвана тем, как Android сглаживает объекты. Внутри он будет вызывать Parcel#writeValue(Object) который имеет длинную цепочку if / else, а if (o instanceof List) – перед instanceof Serializable . Так как Departures являются List он будет помещать его в список вместо него, а когда он отбрасывает данные, он не знает, что это особый вид списка.

Вам нужно использовать то, что не расширяет List чтобы обойти эту проблему.

Я знаю, что я немного опаздываю на этот, но столкнулся с подобной проблемой с массивом сериализуемых.

Я сделал это, обернув массив внутри собственного собственного класса.

 private class ArrayHolder implements Serializable{ public Serializable[] _myArray; public ArrayHolder(Serializable myArray){ _myArray = myArray; } } 

Затем, чтобы сохранить все, что я сделал, было

 bundle.putSerializable("name",new ArrayHolder(arrayToBeSaved)); 

При десериализации:

 ArrayHolder arrayHolder = (ArrayHolder) bundle.getSerializable("name"); arrayRecovered = arrayHolder._myArray; 

Я не знаю, ПОЧЕМУ это работает, но это так.

Intereting Posts
Диалоговое окно Datepicker не соответствует выбранной дате Android Vertical Seek Bar, например приложение Google Play Music Андроид – просто выцветать и исчезать в анимации для просмотра WebView не загружает мой HTML второй раз? Портирование Card.IO на C # Xamarin Studio Как автоматически увеличить количество проектов Android в Eclipse (предпочитайте портативное решение) Получите свободное пространство во внутренней памяти Как установить драйвер USB для Nexus One в Windows 7 для отладки? Где Visual Editor для Eclipse с плагином ADT В Android, как получить ширину Textview, которая установлена ​​на Wrap_Content Twitter4j => AndroidRuntime (446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken Лучший подход для oldschool 2D zelda-like game В Фрагмент на задней кнопке нажата Действие пустое Какие инструменты и методы Android лучше всего подходят для поиска утечек памяти / ресурсов? Попробуйте использовать Window.FEATURE_CUSTOM_TITLE, но получило исключение: вы не можете комбинировать собственные заголовки с другими функциями названия.