Serialización de objetos en Kotlin: resumen de bibliotecas y guía práctica
La serialización es el proceso de convertir objetos complejos (clases, estructuras de datos) en un formato adecuado para almacenamiento o transmisión a través de una red (JSON, XML, Protobuf). La operación inversa — la deserialización — restaura el objeto desde dicho formato. En Kotlin, gracias a su concisión y seguridad de tipos, la serialización se implementa de manera especialmente elegante. En este artículo, analizaremos tres enfoques principales: la biblioteca estándar kotlinx.serialization, así como las populares soluciones Java Gson y Jackson, adaptadas para Kotlin.
1. kotlinx.serialization — la solución oficial de JetBrains
La biblioteca kotlinx.serialization es parte del ecosistema de Kotlin y cuenta con el respaldo de los desarrolladores del lenguaje. Ofrece un enfoque nativo sin reflexión, lo que garantiza un alto rendimiento y seguridad de tipos en tiempo de compilación.
Configuración (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")}Ejemplo: clase básica y serialización
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("Alexey", 30, "alex@example.com") val jsonString = Json.encodeToString(user) println(jsonString) // {"name":"Alexey","age":30,"email":"alex@example.com"}
val decoded = Json.decodeFromString<User>(jsonString) println(decoded) // User(name=Alexey, age=30, email=alex@example.com)}Ventajas
- Seguridad de tipos: los errores de serialización se detectan en tiempo de compilación.
- Soporte multiplataforma: funciona en JVM, JS, Native (KMP).
- Extensibilidad: serializadores personalizados para tipos complejos.
- Soporte integrado para null, enum, sealed class, colecciones.
Ejemplo avanzado: objetos anidados y listas
@Serializabledata class Address(val city: String, val street: String)
@Serializabledata class Person(val name: String, val addresses: List<Address>)
fun main() { val person = Person("Maria", listOf( Address("Moscú", "Tverskaya"), Address("SPb", "Nevsky") )) val json = Json { prettyPrint = true } println(json.encodeToString(person)) // { // "name": "Maria", // "addresses": [ // { "city": "Moscú", "street": "Tverskaya" }, // { "city": "SPb", "street": "Nevsky" } // ] // }}2. Gson — ligero y simple
La biblioteca Gson de Google es ampliamente conocida en el mundo Java. Para Kotlin se utiliza con configuración adicional para manejar correctamente los data class y los campos anulables.
Configuración
implementation("com.google.code.gson:gson:2.10.1")Ejemplo con 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, "Portátil", 75000.0) val json = gson.toJson(product) println(json) // {"id":1,"title":"Portátil","price":75000.0}
val back = gson.fromJson(json, Product::class.java) println(back) // Product(id=1, title=Portátil, price=75000.0)}Características
- No requiere anotaciones — funciona con cualquier clase.
- Requiere especificar explícitamente el tipo al deserializar (puede ser incómodo con genéricos).
- Por defecto no maneja