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

Kotlin 1.7中含值类属性的@Parcelize编译错误及解决方案咨询

问题分析与解决方案

编译错误原因

Kotlin 1.7.x版本对@Parcelize的类型校验逻辑做了严格调整,相比1.6.10,不再默认支持值类(value class)的自动Parcel序列化。虽然你的Id值类底层封装的是Long(属于Parcel原生支持类型),但新版本要求显式声明该类型的序列化方式,因此触发编译错误。

@RawValue方案的合理性与风险

  • 合理性:短期可以解决编译问题,@RawValue会通过writeValue()/readValue()来序列化值类。由于当前Id的底层类型是Long,运行时能正常完成序列化/反序列化。
  • 风险:正如你担心的,这确实是临时 workaround。如果后续Id被修改为包含非Parcelable类型的属性(比如新增一个自定义的非Parcelable对象),编译阶段不会报错,但运行时会抛出序列化异常,难以提前发现问题。

更优解决方案

给值类Id也添加@Parcelize注解并实现Parcelable,这样@Parcelize可以直接识别并生成安全的序列化逻辑,完全避免运行时风险,同时保持代码的一致性。修改后的代码如下:

@Parcelize
data class Example(val id: Id) : Parcelable

@JvmInline
@Parcelize
value class Id(val long: Long) : Parcelable

这个方案的优势:

  • 编译时就能校验类型合法性,避免潜在运行时异常
  • 符合@Parcelize的设计规范,代码更健壮
  • 不需要依赖@RawValue的隐式序列化逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:25:46