【问题标题】:Android Intent Parcelable: Class not found when unmarshallingAndroid Intent Parcelable:解组时找不到类
【发布时间】:2014-03-28 06:13:04
【问题描述】:

我在 Stackoverflow 中查看了“解组时未找到类”问题的所有答案,但我没有找到解决我的情况的方法。我尝试了任何变体,但没有奏效。 我收到以下错误:

这是我的课程:

第一类:

public class Class1 implements Parcelable, Serializable {
    private static final long serialVersionUID = -3892107077759983950L;
    private long id;
    private ArrayList<Class2> details;
    public Class1(long id, ArrayList<Class2> details) {
        this.id = id;
        this.details = details;
    }
    public Class1(Parcel in) {
        this.id = in.readLong();
        details = new ArrayList<Class2>((Collection<? extends Class2>) Arrays.asList(in.readParcelableArray(Class2.class.getClassLoader())));
//      details = (ArrayList<OrderDetail>)in.readSerializable();
//      details = in.readArrayList(Class2.class.getClassLoader());
//      in.readList(details, Class2.class.getClassLoader());
//      in.readTypedList(details, Class2.CREATOR);
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(id);
//      dest.writeSerializable(details);        
//      dest.writeList(details);
//      dest.writeTypedList(details);
        dest.writeParcelableArray(ordDetailListToArr(), flags);
    }
    @Override
    public int describeContents() { return 0; }
    public static final Parcelable.Creator<Class1> CREATOR
    = new Parcelable.Creator<Class1>() {
        public Class1 createFromParcel(Parcel in) {
            return new Class1(in);
        }
        public Class1[] newArray(int size) {
            return new Class1[size];
        }
    };
}

二等奖:

public class Class2 implements Parcelable, Serializable {
    private static final long serialVersionUID = 3242734374178052427L;
    private long orderId;
    private Class3 Class3;
    public Class2(long orderId, Class3 Class3) {
        this.orderId = orderId;
        this.Class3 = Class3;
    }
    private Class2(Parcel in) {
        this.orderId = in.readLong();
        this.Class3 = (Class3) in.readParcelable(Class3.class.getClassLoader());
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(orderId);
        dest.writeParcelable(Class3, flags);
    }
    @Override
    public int describeContents() { return 0;}
    public static final Parcelable.Creator<Class2> CREATOR
    = new Parcelable.Creator<Class2>() {
        public Class2 createFromParcel(Parcel in) {
            return new Class2(in);
        }
        public Class2[] newArray(int size) {
            return new Class2[size];
        }
    };
}

第三类:

public class Class3 extends Class4 implements Cloneable, Serializable {
    private static final long serialVersionUID = 8712386538880552241L;
    private int count;
    public Class3(Class4 Class4, int count) {
        super(Class4.getId(), Class4.getName());
        this.count = count;
    }
    private Class3(Parcel in) {
        super(in);
        this.count = in.readInt();
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeInt(count);
    }
    @Override
    public int describeContents() { return 0;}
    public static final Parcelable.Creator<Class3> CREATOR
    = new Parcelable.Creator<Class3>() {
        public Class3 createFromParcel(Parcel in) {
            return new Class3(in);
        }
        public Class3[] newArray(int size) {
            return new Class3[size];
        }
    };
}

第四班:

public class Class4 implements Parcelable, Serializable {
    private static final long serialVersionUID = -8394588748958519736L;
    private long id;
    private String name;
        public Class4(long id, String name) {
        this.id = id;
        this.name = name;
    }
    public Class4(Parcel in) {
        this.id = in.readLong();
        this.name = in.readString();
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(id);
        dest.writeString(name);
    }
    @Override
    public int describeContents() { return 0;}
    public static final Parcelable.Creator<Class4> CREATOR
    = new Parcelable.Creator<Class4>() {
        public Class4 createFromParcel(Parcel in) {
            return new Class4(in);
        }
        public Class4[] newArray(int size) {
            return new Class4[size];
        }
    };  
}

我在所有类中使用 Serializable 通过 Socket 通道交换(读/写对象)数据。

我通过以下方式将数据从我的第一个活动传递到第二个活动:

第一个活动:

Class1 class1 = ...;
Intent secondActivity = new Intent(FirstActivity.this, SecondActivity.class);
orderedProductsActivity.putExtra("mydata", (Parcelable)class1);
startActivity(secondActivity);

第二个活动:

Class1 class1 = (Class1) getIntent().getParcelableExtra("mydata");

【问题讨论】:

  • 谢谢@kalyanpvs 我读了这个答案,但没有帮助
  • 好的..你为什么要让你的类同时扩展parcelable和serializable??
  • 你是如何将这些数据从一个活动传递到另一个活动的??

标签: android android-intent parcelable


【解决方案1】:

我以前也遇到过这个问题,在我的情况下它与ArrayList有关,您可以尝试一下吗:

array = (ArrayList<Long>) in.readSerializable();

dest.writeSerializable(array);

而不是使用writeParcelableArray

【讨论】:

  • 如果我使用这段代码出现“Caused by: java.lang.NullPointerException java.io.ByteArrayInputStream.(ByteArrayInputStream.java:60) android.os.Parcel.readSerializable(Parcel.java :2210)" 错误
  • 如果我只使用可序列化并删除我的类中的所有可打包实现,所有问题都会消失
  • 检查你的class4,你将2个字段写入Parcel但你读取了7,所以它会崩溃。只是为了测试,您可以使用其他一些类(如字符串、整数或 long)作为数组列表的内容来检查它是否有效?
  • 谢谢@Guillermo Merino 我在写问题时犯了错误我编辑了我的问题
  • 您可以使用字符串、长整数、整数等数组列表来测试您的包裹数组方法吗?只是为了确保那部分有效
猜你喜欢
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多