从包

时间:2017-12-10 18:10:41

标签: android serialization arraylist bundle classcastexception

我知道在堆栈溢出中存储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);        
    }
}

现在我有ArrayListPointFSerializable这样的serializable个对象,ArrayList,因为PointFSerializableBundle 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?

1 个答案:

答案 0 :(得分:0)

PointF是可分区的,这意味着您可以将标准PointF放入一个包中。如果一个类既可序列化又可分类,Android将推迟写入和读取一个包。发生的事情是因为您没有覆盖parceling方法,Android将您的对象包装为标准PointF。如果您需要能够在其之外序列化您的类,请确保覆盖Parcelable界面中所需的方法。