在 onSaveInstanceState 中嘗試將 ArrayList<ProfileDetails> 強轉為 Parcelable 存入 Bundle,導致運行時崩潰。ArrayList 本身實作 Serializable,但不實作 Parcelable,無法直接用 putParcelable。
// 錯誤寫法
savedInstanceState.putParcelable("Old", (Parcelable) profileDetails); // ClassCastException
確認 ProfileDetails 實作 Serializable:
// 保存
savedInstanceState.putSerializable("Old", profileDetails); // ArrayList 本身可序列化
// 恢復
profileDetails = (ArrayList) savedInstanceState.getSerializable("Old");
讓 ProfileDetails 實作 Parcelable,並使用 putParcelableArrayList:
// ProfileDetails 類別
data class ProfileDetails(...) : Parcelable {
// 需實作 writeToParcel、CREATOR 等(Kotlin 用 @Parcelize 自動生成)
}
// 保存
savedInstanceState.putParcelableArrayList("Old", profileDetails)
// 恢復
profileDetails = savedInstanceState.getParcelableArrayList("Old")!!
ArrayList 只實作 Serializable,強轉會崩潰。ProfileDetails 必須實作 Serializable 或 Parcelable,否則元素無法序列化。Bundle 有大小限制(約 50KB),大列表建議用 ViewModel + SavedStateHandle 或本地快取。採用 ViewModel + SavedStateHandle 自動處理配置變更保存,程式碼更簡潔且不受 Bundle 大小限制:
class MyViewModel(handle: SavedStateHandle) : ViewModel() {
var profileDetails: ArrayList = handle.get("Old") ?: arrayListOf()
set(value) { handle["Old"] = value }
}
徹底理解序列化機制,選擇適合場景的方案,才能避免此類崩潰。