如何从getSerializable获取ArrayList对象而非Serializable类型
解决方案
首先需要确保你的自定义MyDay类已经正确实现了Serializable接口,这是序列化传输的前提。
你遇到的问题是getSerializable默认返回的是Serializable?父类类型,只需要做安全的类型转换为MyDay类即可直接访问内部字段,有两种常用写法:
通用兼容写法(兼容所有Android版本)
使用安全类型转换符as?做类型转换,转换失败会直接返回null,不会触发类型转换崩溃:
val args = arguments?.getSerializable(FIVE_DAYS_DATA) as? MyDay args?.apply { // 此处可直接访问MyDay类的内部属性,比如 date、temperature 等自定义字段 }
TargetSdk >= 33 优化写法
如果你的项目目标版本适配到Android 13(API 33)及以上,可以使用官方新增的类型安全重载方法,避免显式强转,同时消除旧方法的废弃警告:
val args = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { arguments?.getSerializable(FIVE_DAYS_DATA, MyDay::class.java) } else { @Suppress("DEPRECATION") arguments?.getSerializable(FIVE_DAYS_DATA) as? MyDay }
注意事项
MyDay类内部所有成员属性的类型都需要实现Serializable接口,否则会在序列化/反序列化过程中抛出运行时异常。- 若后续对性能有更高要求,推荐改用Android平台原生优化的
Parcelable实现序列化,性能远优于Serializable。
内容的提问来源于stack exchange,提问作者SoulReaver313
相关产品推荐
相关产品推荐

