我有以下课程:
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
数组答案 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
。