我知道在堆栈溢出中存储ArrayList
Bundle
的问题有很多问题,但即使在阅读了很多文档和文档之后,我也不明白我在下面描述的问题。我不是在寻求帮助解决这个特定的编程问题,因为我有一个"解决方案",而是想要理解为什么我得到错误以及为什么我的"解决方案"的工作原理。
标准PointF
类(遗憾的是)不可序列化,这就是为什么我扩展该类并(希望正确地)实现pointF
序列化的代码,如下所示:
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
是可序列化的,我可以这样做到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
通过getSerializable()
检索嵌套的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
这是我不明白的。
我原本预计此错误ArrayList<PointF>
属于tpye ArrayList<PointFSerializable>
,但显然它不应该是,因为我将其定义为pointFSerializable
类型,如果不是那个类型然后我原本期望在外部for循环中得到一个错误。
现在,在内部for循环的主体中,我无论如何都希望将PointF
强制转换为 for(PointF pointF : strokeSerializable) {
。因此,我可以通过
bundle.getSerializable("Drawing");
然后一切正常。但为什么呢?
为什么,从ArrayList<ArrayList<PointF>>
,我显然得到的东西我可以像ArrayList<ArrayList<PointFSerializable>>
(甚至不是可序列化的对象!)那样对待,但不像<?php echo $_SERVER['PHP_SELF']; ?>
,甚至虽然我把后一种类型的对象放入Bundle?
答案 0 :(得分:0)
PointF是可分区的,这意味着您可以将标准PointF放入一个包中。如果一个类既可序列化又可分类,Android将推迟写入和读取一个包。发生的事情是因为您没有覆盖parceling方法,Android将您的对象包装为标准PointF。如果您需要能够在其之外序列化您的类,请确保覆盖Parcelable界面中所需的方法。