Сериализация объектов в Kotlin: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Сериализация объектов в 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.

Под

Рекомендаций