2

我有以下课程:

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[]

如何正确地将可序列化转换为 Image 数组

4

4 回答 4

0

您将图像作为 arrayList 传递。但是你把它当作一个数组..

使用以下代码

Serializable extras = getIntent().getSerializableExtra("Images");
    if (extras != null) {
        images = (ArrayList<Image>) extras;
    }
于 2013-03-19T12:32:54.863 回答
0

快速思考,您可以简单地将图像制作成 bytearray[],并且由于咬数组是可序列化的原始类型。

于 2013-03-19T12:30:49.593 回答
0

你投不正确

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

您将 ListArray 赋予意图,并尝试使用数组对其进行投射

这条线不正确

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

用。。。来代替

 if (extras != null) {
        images = (ListArray<Image>) extras;
    }
于 2013-03-19T12:31:02.423 回答
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名为CREATORtype的字段Parcelable.Creator<T>,而对于内部类型,这在 Java 语言中根本不可能。这就是为什么您必须切换到嵌套(静态)类,最终在构造函数中传递您当前的外部实例并相应地更改字段可见性(从privatepublic或包私有)。顺便说一句,这也将提高你的代码库的可测试性,因为你减少了耦合。我的意思是,而不是这个不可编译的来源:

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移出Product.

于 2013-03-19T22:58:04.827 回答