You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fragment与Service间传递ArrayList及Parcel编组异常排查

异常成因

  • 你自定义的AudioModel类未实现序列化接口:Android Intent 跨组件传递自定义类对象时,要求对象必须实现Serializable或Parcelable序列化接口,才能被系统转换为可跨进程传输的Parcel流,未实现对应接口就会抛出"unable to marshal value"序列化失败异常。
  • 隐藏场景:即便你声明了AudioModel实现序列化接口,若类内部包含未实现序列化的自定义成员属性,同样会触发该异常。

解决方案

这里提供两种可选实现方案:

方案1:实现Serializable接口(实现成本低,适合简单场景)

仅需要给AudioModel类追加Serializable接口实现即可,无需修改原有传递、接收逻辑:

import java.io.Serializable

// 追加实现Serializable接口
data class AudioModel(
    val uri: Uri,
    val songTitle: String,
    val songArtist: String,
    val songPath: String
) : Serializable

方案2:实现Parcelable接口(安卓官方推荐,性能更优)

Parcelable是Android平台专属的序列化方案,性能比Serializable高2~3倍,Kotlin可以通过@Parcelize注解快速实现,无需手写序列化逻辑:

  1. 先在模块级build.gradle中引入Parcelize插件:
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-parcelize' // 追加该插件
}
  1. 修改AudioModel实现Parcelable接口:
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class AudioModel(
    val uri: Uri,
    val songTitle: String,
    val songArtist: String,
    val songPath: String
) : Parcelable
  1. 对应调整Intent的传递、接收逻辑:
    发送端:
intent.putParcelableArrayListExtra(AUDIO_LIST, audioList)

接收端:

val audioList = intent.getParcelableArrayListExtra<AudioModel>(AUDIO_LIST)

注意事项

如果AudioModel内部包含其他自定义类型的成员属性,对应类型也需要同步实现序列化接口,否则仍然会触发序列化失败异常。

内容的提问来源于stack exchange,提问作者Muhammad Sajid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:06:01