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
相关产品推荐
相关产品推荐

