从包中存储和检索自定义可序列化类的 ArrayList

高岭土

我知道在 stackoverflow上有很多关于在ArrayLists 中存储s 的问题Bundle,但是即使在阅读了其中的许多问题和文档之后,我还是不明白我在下面描述的问题。我并不是在寻求解决这个特定编程问题的帮助,因为我有一个“解决方案”,而是想了解为什么我会收到错误以及为什么我的“解决方案”有效。

标准PointF类(不幸的是)不可序列化,这就是为什么我扩展该类并(希望正确)实现pointFs序列化的代码如下:

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因为ArrayListPointFSerializable是可序列化的,因此我可以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);

在另一个函数中,我稍后ArrayListBundle bundleviagetSerializable()和 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

这是我不明白的。

我原以为这个错误是strokeSerializabletpye ArrayList<PointF>,但是,显然它不应该是,因为我将它定义为类型ArrayList<PointFSerializable>,如果它不是那种类型,那么我会期望已经在外部 for 循环中出现错误.

现在,在内部 for 循环的主体中,我无论如何都想pointFSerializablePointF. 因此,我可以将有问题的行替换为

  for(PointF pointF : strokeSerializable) {

然后一切正常。但为什么?

为什么,从bundle.getSerializable("Drawing");即使我将后一种类型的对象放入 Bundle 中,我是否能明显地取回我可以像对待ArrayList<ArrayList<PointF>>(甚至不是可序列化对象!)但不像 的东西ArrayList<ArrayList<PointFSerializable>>

丹尼米其林

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ArrayList中的自定义对象和可搜索

来自分类Dev

使用Gson将自定义类的ArrayList序列化为JSON并通过HTTP发送数据

来自分类Dev

无法检索Android自定义类arraylist数据

来自分类Dev

订单ArrayList可序列化

来自分类Dev

使自定义对象的ArrayList可拆分

来自分类Dev

序列化arraylist中的输出

来自分类Dev

对自定义类的ArrayList进行排序

来自分类Dev

实例化ArrayList的ArrayList

来自分类Dev

修改ArrayList中的ArrayList

来自分类Dev

在分组的ArrayList ArrayList中

来自分类Dev

比较自定义的ArrayList中的日期

来自分类Dev

Arraylist自定义位置

来自分类Dev

ArrayList 的自定义排序

来自分类Dev

从类中检索ArrayList信息

来自分类Dev

Java反序列化和ArrayList怪异异常

来自分类Dev

StackOverflowError:LinkedList和ArrayList反序列化

来自分类Dev

StackOverflowError:LinkedList和ArrayList反序列化

来自分类Dev

使用XML序列化具有另一个ArrayList的类的ArrayList

来自分类Dev

将ArrayList <自定义对象>保存到本地存储

来自分类Dev

序列化包含对象ArrayList的对象

来自分类Dev

如何序列化对象的ArrayList?

来自分类Dev

使用BufferedImages序列化对象的ArrayList

来自分类Dev

Java ArrayList序列化问题

来自分类Dev

序列化包含对象ArrayList的对象

来自分类Dev

反序列化对象的Arraylist

来自分类Dev

ArrayList可通过Java序列化

来自分类Dev

需要帮助以了解Java中ArrayList的反序列化

来自分类Dev

属性未记录在序列化arraylist中

来自分类Dev

Java中ArrayList中的ArrayList