如何对Gradle插件生成的data class实现JSON(反)序列化
自动生成Kotlin data class的JSON双向序列化实现方案
kotlinx.serialization 无注解适配方式
不需要在生成类源码上添加@Serializable注解,有两种成熟实现路径:
- 编译期指定序列化类清单:kotlinx.serialization 1.4及以上版本支持通过编译器插件参数,直接指定需要生成序列化器的类全限定名,效果和类上添加
@Serializable完全一致。你只需要在模块的Gradle构建脚本中给Kotlin编译任务加参数,传入所有待序列化的生成类全类名即可。
配置示例:
如果生成的类统一存放在固定包路径下,可以直接在构建脚本中写遍历逻辑,编译期自动扫描该包下所有data class动态拼接参数,不需要手动维护类名清单,后续插件生成新的类也会自动适配。tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions { freeCompilerArgs += listOf( "-P", "plugin:kotlinx.serialization:additionalSerializableClasses=com.yourapp.gen.Model1,com.yourapp.gen.Model2" ) } } - 运行时反射序列化:引入官方的
kotlinx-serialization-reflect模块,它可以在运行时通过Kotlin反射自动为任意data class构造序列化逻辑,不需要提前生成序列化器,也不需要类上有任何注解。使用时直接通过反射拿到对应类的KSerializer实例传入序列化/反序列化方法即可。要注意这个方案的运行性能比编译期生成序列化器低20%左右,且需要配置混淆规则保留生成类的字段信息,避免反射读取失败。
更低成本的替代方案
如果项目没有强绑定kotlinx.serialization,优先选择天生支持无注解序列化的JSON库,适配成本更低:
- Moshi + Kotlin反射适配器:构造Moshi实例时添加
KotlinJsonAdapterFactory,不需要给任何类加注解,就能自动识别Kotlin data class的主构造字段、默认值、可空性,序列化逻辑和代码生成的适配器完全一致。如果对性能有要求,也可以配置Moshi的代码生成任务,指定生成类的包路径,编译期自动为这些类生成对应Adapter,全程不需要修改生成类的源码。 - Jackson Kotlin模块:引入
jackson-module-kotlin后,注册了Kotlin模块的ObjectMapper可以直接序列化任意Kotlin data class,不需要额外注解,对Kotlin语言特性的支持已经非常成熟,缺点是依赖包体积更大,序列化性能略低于Moshi和kotlinx.serialization。
选型参考
- 项目已经统一使用kotlinx.serialization的场景,优先选编译期传参指定类清单的方案,性能最优,一次配置后不需要后续维护。
- 没有序列化库绑定的场景,优先选Moshi反射适配器方案,接入只需要加两行依赖和Moshi初始化代码,不需要额外配置构建逻辑,性能足够覆盖绝大多数业务场景。
- 完全不需要手动做字段映射,也不需要给每个类单独写适配器,这类自动生成的data class结构统一(主构造器覆盖所有字段、无自定义序列化逻辑),通用的编译期生成/运行时反射方案可以100%覆盖需求。
内容的提问来源于stack exchange,提问作者Roberto Leinardi
相关产品推荐
相关产品推荐

