Kotlin中的对象序列化:库与工具完整指南
序列化是将对象转换为可保存(例如保存到文件)或通过网络传输(通过REST API、Kafka消息等)的格式的过程。反向过程——反序列化——则从该格式恢复对象。在Kotlin生态系统中,有多个强大的序列化库,每个都有其特点。在本文中,我们将分析四种主要方法:kotlinx.serialization、Gson、Moshi和Jackson。
1. kotlinx.serialization —— Kotlin的原生选择
由JetBrains开发的kotlinx.serialization库是Kotlin项目的“黄金标准”。它支持多平台(JVM、JS、Native),并使用注解在编译阶段生成代码。
依赖配置(Gradle)
plugins { kotlin("jvm") version "1.9.0" kotlin("plugin.serialization") version "1.9.0"}
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")}使用示例
import kotlinx.serialization.Serializableimport kotlinx.serialization.json.Json
@Serializabledata class User(val name: String, val age: Int, val email: String? = null)
fun main() { val user = User("伊万", 30, "ivan@example.com")
// 序列化为JSON val jsonString = Json.encodeToString(user) println(jsonString) // {"name":"伊万","age":30,"email":"ivan@example.com"}
// 从JSON反序列化 val decoded = Json.decodeFromString<User>(jsonString) println(decoded) // User(name=伊万, age=30, email=ivan@example.com)}特点
- 空安全:通过
?支持可空字段 - 多态:支持密封类和继承体系的序列化
- 自定义格式:JSON、CBOR、Protobuf、Properties
- 性能:无反射的代码生成
2. Gson —— Google的经典库
Gson是Java/Kotlin最古老的库之一。它使用简单,但使用反射,这可能会在处理大量数据时降低性能。
依赖配置
implementation("com.google.code.gson:gson:2.10.1")示例
import com.google.gson.Gson
data class Product(val id: Int, val title: String, val price: Double)
fun main() { val gson = Gson() val product = Product(1, "笔记本电脑", 79999.99)
// 序列化 val json = gson.toJson(product) println(json) // {"id":1,"title":"笔记本电脑","price":79999.99}
// 反序列化 val restored = gson.fromJson(json, Product::class.java) println(restored) // Product(id=1, title=笔记本电脑, price=79999.99)}特点
- 简单:最少配置
- 灵活:支持自定义
TypeAdapter处理复杂类型 - 缺点:使用反射,原生不支持Kotlin data class(需要插件或
@JvmField)
3. Moshi —— Gson的现代替代品
Square公司的Moshi是一个轻量级库,开箱即用支持Kotlin。它通过注解使用代码生成,因此比Gson更快。
依赖配置
implementation("com.squareup.moshi:moshi-kotlin:1.15.0")kapt("com.squareup.moshi:moshi-kotlin-codegen:1.15.0") // 用于代码生成示例
import com.squareup.moshi.Moshiimport com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
@JsonClass(generateAdapter = true)data class Book(val isbn: String, val title: String, val authors: