繁体   English   中英

在onRestoreInstanceState中反序列化时出现奇怪的ClassCastException

[英]Weird ClassCastException when deserializing in onRestoreInstanceState

onSaveInstanceState()

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

onRestoreInstanceState

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

当我旋转屏幕时,重新启动活动并恢复其状态。 它工作正常。 如果我离开Activity,经过一段时间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;

我不知道为什么它有效,但确实如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM