Kotlin 对象序列化:库概览与实践指南
序列化是将复杂对象(类、数据结构)转换为便于存储或网络传输的格式(JSON、XML、Protobuf)的过程。反向操作——反序列化——则从这种格式中恢复对象。在 Kotlin 中,由于其简洁性和类型安全性,序列化的实现尤为优雅。本文将介绍三种主要方法:标准库 kotlinx.serialization,以及为 Kotlin 适配的流行 Java 解决方案 Gson 和 Jackson。
1. kotlinx.serialization —— JetBrains 官方解决方案
kotlinx.serialization 库是 Kotlin 生态系统的一部分,并由语言开发者维护。它提供了一种无需反射的原生方法,从而在编译阶段实现高性能和类型安全。
依赖配置 (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, "alex@example.com") val jsonString = Json.encodeToString(user) println(jsonString) // {"name":"阿列克谢","age":30,"email":"alex@example.com"}
val decoded = Json.decodeFromString<User>(jsonString) println(decoded) // User(name=阿列克谢, age=30, email=alex@example.com)}优势
- 类型安全:序列化错误在编译阶段即可发现。
- 跨平台支持:可在 JVM、JS、Native (KMP) 上运行。
- 可扩展性:为复杂类型提供自定义序列化器。
- 内置支持 null、enum、sealed class、集合。
进阶示例:嵌套对象与列表
@Serializabledata class Address(val city: String, val street: String)
@Serializabledata class Person(val name: String, val addresses: List<Address>)
fun main() { val person = Person("玛丽亚", listOf( Address("莫斯科", "特维尔大街"), Address("圣彼得堡", "涅瓦大街") )) val json = Json { prettyPrint = true } println(json.encodeToString(person)) // { // "name": "玛丽亚", // "addresses": [ // { "city": "莫斯科", "street": "特维尔大街" }, // { "city": "圣彼得堡", "street": "涅瓦大街" } // ] // }}2. Gson —— 轻量级且简单
Google 的 Gson 库在 Java 世界中广为人知。在 Kotlin 中使用时,需要进行额外配置以正确处理 data class 和可空字段。
依赖配置
implementation("com.google.code.gson:gson:2.10.1")Gson 示例
import com.google.gson.Gsonimport com.google.gson.reflect.TypeToken
data class Product(val id: Int, val title: String, val price: Double?)
fun main() { val gson = Gson() val product = Product(1, "笔记本电脑", 75000.0) val json = gson.toJson(product) println(json) // {"id":1,"title":"笔记本电脑","price":75000.0}
val back = gson.fromJson(json, Product::class.java) println(back) // Product(id=1, title=笔记本电脑, price=75000.0)}特点
- 无需注解——可与任何类一起使用。
- 反序列化时需要显式指定类型(对于泛型可能不方便)。
- 默认不处理