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

如何对Gradle插件生成的data class实现JSON(反)序列化

自动生成Kotlin data class的JSON双向序列化实现方案

kotlinx.serialization 无注解适配方式

不需要在生成类源码上添加@Serializable注解,有两种成熟实现路径:

  • 编译期指定序列化类清单:kotlinx.serialization 1.4及以上版本支持通过编译器插件参数,直接指定需要生成序列化器的类全限定名,效果和类上添加@Serializable完全一致。你只需要在模块的Gradle构建脚本中给Kotlin编译任务加参数,传入所有待序列化的生成类全类名即可。
    配置示例:
    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs += listOf(
                "-P",
                "plugin:kotlinx.serialization:additionalSerializableClasses=com.yourapp.gen.Model1,com.yourapp.gen.Model2"
            )
        }
    }
    
    如果生成的类统一存放在固定包路径下,可以直接在构建脚本中写遍历逻辑,编译期自动扫描该包下所有data class动态拼接参数,不需要手动维护类名清单,后续插件生成新的类也会自动适配。
  • 运行时反射序列化:引入官方的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:09:10