反序列化图像对象数组

时间:2013-03-19 12:23:36

标签: java android deserialization

我有以下课程:

public class DetailedProduct implements Serializable {
    //attributes + get and set
    private Colour colour;
    //get+set

  public class Colour implements Serializable{
     private ArrayList<Image> images;
    //get+set

    public Image[] getImages() {
      return images.toArray(new Image[images.size()]);
    }
  }

  public class Image implements Serializable{

    private static final long serialVersionUID = 3460333138445770749L;
    private String image1;
    private String image2;
    private String image3;

        //get/set methods
  }
 }

我之后创建了一个Intent,如下所示

  DetailedProduct.Colour mCurrentColour;
  Intent myIntent = new Intent(DetailsActivity.this, ImageGallery.class);
  myIntent.putExtra("Images", mCurrentColour.getImages());
  startActivity(myIntent);

在ImageGallery课程中,我尝试了以下代码:

   Serializable extras = getIntent().getSerializableExtra("Images");
    if (extras != null) {
        images = (Image[]) extras;
    }

但我采取以下例外: java.lang.RuntimeException:无法启动活动ComponentInfo {com./com.productdetails.ProductImageGallery}:java.lang.ClassCastException:java.lang.Object []无法强制转换为com.productdetails.DetailedProduct $ Image []

如何正确地将serializable转换为Image

数组

4 个答案:

答案 0 :(得分:0)

从快速思考,你可以简单地将图像变成bytearray [],并且因为bite数组是可序列化的原始类型。

答案 1 :(得分:0)

你施放不正确

 java.lang.ClassCastException: java.lang.Object[] cannot be cast to com.productdetails.DetailedProduct$Image[]

您将List数组赋予intent并尝试使用数组

进行转换

此行不正确

 if (extras != null) {
        images = (Image[]) extras;
    }

替换为

 if (extras != null) {
        images = (ListArray<Image>) extras;
    }

答案 2 :(得分:0)

您将图像作为arrayList传递。但是你把它当成阵列......

使用以下代码

Serializable extras = getIntent().getSerializableExtra("Images");
    if (extras != null) {
        images = (ArrayList<Image>) extras;
    }

答案 3 :(得分:0)

Android运行时无法序列化阵列。数组类型仍然实现Serializable,但是当它从Intent使用的Bundle返回时,它已经丢失了所有信息(包括类型,总是Ljava.lang.Object。互联网上的一些答案表明使用Parcelable,但我尝试过并没有成功。

可以实现的是传输Parcelable个对象的集合,但是以ArrayList的形式,这也恰好是您在原始样本中使用的数据结构。调用代码如下所示:

Intent intent = new Intent(this, Target.class);
ArrayList<Foo> data = new ArrayList<Foo>();
data.add(new Foo());

intent.putParcelableArrayListExtra("data", data);
intent.putExtra("serializable", new Foo[] {new Foo()});
startActivity(intent);

我使用了通常的名为Foo的虚拟类,但请注意,实现Parcelable非常繁琐。此外,它要求您的类具有static类型为CREATOR的{​​{1}}字段,并且对于内部类型,这在Java语言中根本不可能。这就是为什么你必须切换到嵌套(静态)类,最终在构造函数中传递当前的外部实例并相应地更改字段visibilty(从Parcelable.Creator<T>private或包 - 私有)。顺便说一句,这也将提高代码库的可测试性,因为您减少了耦合。我的意思是,而不是这个无法编译的来源:

public

类似这样的事情

public class Product implements Parcelable {
  public class Color implements Parcelable {
    public static final Parcelable.Creator<Color> CREATOR; // Illegal!!!
  }
}

但请注意,通过这种方式,您无法访问封闭类的非静态成员,因此最好将public class Product implements Parcelable{ public static class Color implements Parcelable { public Color(Product exOuter) { } } } 移出Color