直接在build.gradle.kts中启用serialization插件并添加依赖即可使用@Serializable和Json.encodeToString():先在libs.versions.toml中定义kotlin和kotlinxSerializationJson版本及插件别名,再在build.gradle.kts中通过alias(libs.plugins.kotlin.serialization)应用插件,并添加implementation(libs.kotlinx.serialization.json)依赖。

直接在 build.gradle.kts 里启用 org.jetbrains.kotlin.plugin.serialization 插件,并添加 kotlinx-serialization-json 依赖,就能用 @Serializable 注解和 Json.encodeToString() ——不需要手写序列化器,也不用反射。
怎么在 build.gradle.kts 中启用 serialization 插件
新版 Kotlin 项目(Kotlin ≥ 1.8)推荐用 plugins { alias(...) } 方式声明插件,前提是已配置 libs.versions.toml:
先在 gradle/libs.versions.toml 里定义版本和插件别名:
[versions]
kotlin = "2.0.21"
kotlinxSerializationJson = "1.9.0"
[libraries]
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
[plugins]
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
再在模块级 build.gradle.kts 中应用:
plugins {
alias(libs.plugins.kotlin.serialization)
}
dependencies {
implementation(libs.kotlinx.serialization.json)
}
如果没用 libs.versions.toml,可退回到传统写法(但不推荐长期维护):
plugins {
kotlin("plugin.serialization") version "2.0.21" apply true
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
}
@Serializable 类必须满足哪些条件
编译期生成序列化器的前提很明确:类必须是 data class 或 object,且所有属性类型都得是 kotlinx.serialization 支持的类型(比如 String、List<Int>、LocalDateTime? 等),否则会报 Serializer for class X is not found 错误。
- 非 data class 的普通 class 默认不支持,除非手动实现
KSerializer - 泛型类如
class Wrapper<T>(val value: T)必须加@Serializable并确保T可序列化,或用@Serializable(with = ...)指定自定义序列化器 - 含
private属性、companion object里的字段、lateinit变量,都不会被自动序列化 —— 它们不在主构造函数参数列表中 - 使用
@SerialName("xxx")可控制 JSON 字段名,但该注解只对 JSON 生效,不影响二进制格式(如Cbor)
为什么 Json.encodeToString 报错 “Serializer not found”
常见触发场景不是代码写错,而是 Gradle 配置漏了或冲突了:
- 插件没 apply 到正确模块(比如只加在
app,但domain模块里用了@Serializable) - 多个 Kotlin 版本混用:
libs.versions.toml里kotlin和kotlinxSerializationJson版本不兼容(查官方 兼容矩阵) - 用了
@Serializable但类里引用了android.os.Parcel、View、Context这类 Android 平台专属不可序列化类型 - 在 JVM 模块用了
androidx.room的@Entity,而 Room 不认@Serializable—— 两者序列化目标不同,不能混用
Android 项目里 Parcelable 和 Serialization 能共存吗
能,但要分清用途:Parcelable 是 Android IPC 专用,走 Binder;Serialization 是通用数据交换(JSON/Protobuf/CBOR),用于网络、本地存储、跨平台通信。
实际项目中常见组合:
- DTO 层用
@Serializable做网络请求/响应(配合 Retrofit +SerializationConverterFactory) - UI 层或 Fragment 间传参仍用
@Parcelize(因为Bundle和Intent强制要求 Parcelable) - 不要试图让一个类同时标
@Parcelize和@Serializable—— 编译器不报错,但语义混乱,且@Parcelize生成的CREATOR和@Serializable生成的serializer()无任何关系
真正容易被忽略的是:@Serializable 类如果要被 Intent.putExtra("key", obj) 传递,必须额外实现 Parcelable(即加 @Parcelize),否则运行时报 RuntimeException: Parcel: unable to marshal value —— 因为 Intent 不认识 kotlinx.serialization。

















