Android Parcelable传ArrayList报RuntimeException异常求助
问题核心原因
你虽然让Entities和内部存储的Entity类都实现了Parcelable接口,但在处理ArrayList<Entity>集合的序列化、反序列化逻辑时,错误使用了Serializable体系的读写方法,这就是抛出运行时异常的直接原因。
具体错误点:
writeToParcel方法中调用dest.writeSerializable(entities)写入集合构造函数反序列化时调用
in.readSerializable()读取集合
上述两个方法只针对实现了Serializable接口的对象生效:即使ArrayList本身实现了Serializable,但你存储的Entity仅实现了Parcelable、未实现Serializable时,序列化流程会因为内部元素不支持Serializable序列化抛出IOException;就算你给Entity同时实现两个接口,这种混用写法的性能也远低于Parcelable专属的集合读写API,还容易出现类型转换异常。
修复方法
替换Entities类中错误的Parcelable读写逻辑,使用Parcelable专用的集合读写API即可,修正后的代码片段如下:
// 修正私有构造函数的反序列化逻辑 private Entities(Parcel in) { // 传入Entity对应的CREATOR,自动完成集合内每个元素的反序列化 entities = in.createTypedArrayList(Entity.CREATOR); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // 写入Parcelable类型集合,不要调用writeSerializable dest.writeTypedList(entities); }
额外注意事项
- 提前确认
Entity类的Parcelable实现符合规范:必须对外声明public static final Parcelable.Creator<Entity> CREATOR静态实例,否则createTypedArrayList无法正常反序列化元素。 - 后续通过Intent/Bundle传递Parcelable对象集合时,永远优先使用
writeTypedList/createTypedArrayList、writeParcelableList这类专属API,不要混用Serializable的序列化方法,既能避免这类异常,也能获得更好的跨进程传递性能。 - 如果不想手动维护Parcelable的读写逻辑,可以使用Android Studio内置的Parcelable代码生成功能,或者在Kotlin环境下使用
@Parcelize注解自动生成实现,减少手动写错API、漏写字段的概率。
内容的提问来源于stack exchange,提问作者Nelson Lopes
相关产品推荐
相关产品推荐

