Kotlin带@Parcelize的数据类传函数引发序列化错误,如何排除函数?
如何让@Parcelize数据类中的函数不参与序列化
嘿,你其实已经找对正确的解决办法啦!
在使用Kotlin的@Parcelize注解实现Parcelable序列化时,要排除某个成员不参与序列化,@IgnoredOnParcel就是专门为此设计的注解。
你的实现完全正确
看你给出的代码,已经给onClick这个函数类型的成员加上了@IgnoredOnParcel,这正是正确的做法:
@Parcelize data class GearCategoryViewModel( val title: String, val imageUrl: String, val categoryId: Int, val comingSoon: Boolean, @IgnoredOnParcel val onClick: (gearCategoryViewModel: GearCategoryViewModel) -> Unit ) : DataBindingAdapter.ListItem // 补全你省略的父类部分
为什么这个注解能生效?
@Parcelize会自动帮你生成Parcelable所需的writeToParcel和createFromParcel逻辑,但它只会处理没有被@IgnoredOnParcel标记的成员。而函数类型(比如你的onClick是一个lambda)本身无法被序列化(因为函数对象承载的是执行逻辑,不是可持久化的数据),所以必须用这个注解把它排除在外,否则编译阶段就会抛出序列化相关的错误。
额外提醒
- 确保你的
GearCategoryViewModel类已经正确关联了Parcelable接口——不过别担心,@Parcelize注解会自动帮你实现这个接口,只要你在类上标注了它就行。 - 后续如果要添加其他不需要序列化的成员(比如自定义的不可序列化对象、工具函数等),都可以用
@IgnoredOnParcel来标记,用法和这个函数完全一致。
内容的提问来源于stack exchange,提问作者Felipe Ribeiro R. Magalhaes
相关产品推荐
相关产品推荐

