Сериализация объектов в Kotlin: обзор библиотек и практическое руководство
Сериализация — это процесс преобразования сложных объектов (классов, структур данных) в формат, удобный для хранения или передачи по сети (JSON, XML, Protobuf). Обратная операция — десериализация — восстанавливает объект из такого формата. В Kotlin, благодаря его лаконичности и безопасности типов, сериализация реализована особенно элегантно. В этой статье мы рассмотрим три основных подхода: стандартную библиотеку kotlinx.serialization, а также популярные Java-решения Gson и Jackson, адаптированные для Kotlin.
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.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, "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, коллекций.
Продвинутый пример: вложенные объекты и списки
@Serializable
data class Address(val city: String, val street: String)
@Serializable
data 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 — легковесный и простой
Библиотека Gson от Google широко известна в мире Java. Для Kotlin её используют с дополнительной настройкой, чтобы корректно обрабатывать data class и nullable-поля.
Подключение
implementation("com.google.code.gson:gson:2.10.1")
Пример с Gson
import com.google.gson.Gson
import 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)
}
Особенности
- Не требует аннотаций — работает с любыми классами.
- Требует явного указания типа при десериализации (может быть неудобно с дженериками).
- По умолчанию не обрабатывает
data classс nullable-полями корректно — рекомендуется использоватьGsonBuilder().serializeNulls().
3. Jackson — мощный и гибкий
Jackson — де-факто стандарт для сериализации в Java-мире. Для Kotlin существует модуль jackson-module-kotlin, который добавляет поддержку data class, аргументов по умолчанию и nullable.