我知道在 stackoverflow上有很多关于在ArrayList
s 中存储s 的问题Bundle
,但是即使在阅读了其中的许多问题和文档之后,我还是不明白我在下面描述的问题。我并不是在寻求解决这个特定编程问题的帮助,因为我有一个“解决方案”,而是想了解为什么我会收到错误以及为什么我的“解决方案”有效。
标准PointF
类(不幸的是)不可序列化,这就是为什么我扩展该类并(希望正确)实现pointF
s序列化的代码如下:
class PointFSerializable extends PointF implements Serializable
{
public PointFSerializable(PointF pointF) {
super(pointF.x, pointF.y);
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
out.writeFloat(x);
out.writeFloat(y);
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
float x = in.readFloat();
float y = in.readFloat();
set(x,y);
}
private void readObjectNoData() throws ObjectStreamException {
set(0f,0f);
}
}
现在我有一个ArrayList
这样的PointFSerializable
对象的嵌套,这是serializable
因为ArrayList
和PointFSerializable
是可序列化的,因此我可以Bundle bundle
按如下方式放入 a :
ArrayList<ArrayList<PointFSerializable>> drawingSerializable = new
ArrayList<ArrayList<PointFSerializable>>();
//populate the nested ArrayList
for([...]) {
ArrayList<PointFSerializable> strokeSerializable = new ArrayList<PointFSerializable>();
for([...]) {
strokeSerializable.add(new PointFSerializable(...));
}
drawingSerializable.add(strokeSerializable);
}
//Put it into the Bundle
bundle.putSerializable("Drawing", drawingSerializable);
在另一个函数中,我稍后ArrayList
从Bundle bundle
viagetSerializable()
和 cast 中检索嵌套,如下所示:
ArrayList<ArrayList<PointFSerializable>> drawingSerializable = (ArrayList<ArrayList<PointFSerializable>>)bundle.getSerializable("Drawing");
到这里一切都按预期工作,但现在我想循环drawingSerializable
:
for(ArrayList<PointFSerializable> strokeSerializable : drawingSerializable) {
for(PointFSerializable pointFSerializable : strokeSerializable) { //<--
[...]
}
}
在标有<--
我得到的行中
java.lang.ClassCastException: android.graphics.PointF cannot be cast to com.cgogolin.myapp.PointFSerializable
这是我不明白的。
我原以为这个错误是strokeSerializable
tpye ArrayList<PointF>
,但是,显然它不应该是,因为我将它定义为类型ArrayList<PointFSerializable>
,如果它不是那种类型,那么我会期望已经在外部 for 循环中出现错误.
现在,在内部 for 循环的主体中,我无论如何都想pointFSerializable
将PointF
. 因此,我可以将有问题的行替换为
for(PointF pointF : strokeSerializable) {
然后一切正常。但为什么?
为什么,从bundle.getSerializable("Drawing");
,即使我将后一种类型的对象放入 Bundle 中,我是否能明显地取回我可以像对待ArrayList<ArrayList<PointF>>
(甚至不是可序列化对象!)但不像 的东西ArrayList<ArrayList<PointFSerializable>>
?
PointF 是可打包的,这意味着您可以将标准 PointF 放入一个包中。如果一个类既可序列化又可分块,Android 将推迟写入和读取到一个parcel。发生的事情是因为您没有覆盖打包方法,Android 将您的对象打包为标准 PointF。如果您需要能够在此之外序列化您的类,请确保覆盖Parcelable接口中所需的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句