Сериализация объектов в 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.Serializable
import kotlinx.serialization.json.Json
@Serializable
data 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)
}
Особенности
- Null safety: поддержка nullable-полей через
? - Полиморфизм: сериализация sealed class и иерархий
- Кастомные форматы: 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
Moshi от Square — это лёгкая библиотека с поддержкой 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.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
@JsonClass(generateAdapter = true)
data class Book(val isbn: String, val title: String, val authors: List<String>)
fun main() {
val moshi = Moshi.Builder()
.addLast(KotlinJsonAdapterFactory())
.build()
val adapter = moshi.adapter(Book::class.java)
val book = Book("978-0-13-468599-1", "Kotlin in Action", listOf("D. Jemerov", "S. Isakova"))