Docs Menu
Docs Home
/ /
Data Formats

Serialización de Kotlin

El controlador Kotlin admite el kotlinx.serialization Biblioteca para serializar y deserializar objetos Kotlin.

El controlador proporciona un serializador Bson eficiente que puede utilizar con clases marcadas como @Serializable para manejar la serialización de objetos Kotlin en datos BSON.

También puede instalar la bson-kotlinx biblioteca para admitir códecs personalizados con configuraciones para codificar valores predeterminados, codificar valores nulos y definir discriminadores de clase.

Nota

Para aprender a usar la interfaz Codec en lugar de la biblioteca de serialización Kotlin para especificar la codificación y decodificación personalizadas de objetos Kotlin a datos BSON, consulte la Guíade códecs.

Puede optar por la serialización de Kotlin si ya está familiarizado con el framework o si prefiere utilizar un enfoque idiomático de Kotlin.

Aunque puedes usar el controlador de Kotlin con la librería de serialización de Kotlin Json, el serializador Json no admite directamente tipos de valores BSON como ObjectId. Debes proporcionar un serializador personalizado que pueda gestionar la conversión entre BSON y JSON.

El controlador Kotlin admite:

  • Todos los tipos de Kotlin compatibles con la biblioteca de serialización de Kotlin

  • Todas las BSON typesdisponibles

El soporte para la serialización en el controlador Kotlin depende de la biblioteca de serialización oficial de Kotlin.

Seleccione una de las siguientes pestañas para ver cómo agregar las dependencias de serialización a su proyecto mediante el uso de Gradle y Maven administradores de paquetes:

Si está utilizando Gradle para administrar sus dependencias, agregue lo siguiente a su build.gradle.kts lista de dependencias:

construir.gradle.kts
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.0")
implementation("org.mongodb:bson-kotlinx:5.0.0")

Si está utilizando Maven para administrar sus dependencias, agregue lo siguiente a su pom.xml lista de dependencias:

pom.xml
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-serialization-core</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson-kotlinx</artifactId>
<version>5.0.0</version>
</dependency>

Para declarar una clase como serializable, anote sus clases de datos Kotlin con la anotación @Serializable del marco de serialización Kotlin.

Puedes usar tus clases de datos en tu código con normalidad después de marcarlas como serializables. El controlador y el framework de serialización de Kotlin gestionan la serialización y deserialización de BSON.

Este ejemplo muestra una clase de datos simple anotada con lo siguiente:

  • @Serializable para marcar la clase como serializable.

  • @SerialName Para especificar el nombre de las propiedades id y manufacturer en el documento BSON. Esto puede usarse en lugar de las anotaciones @BsonId y @BsonProperty, que no son compatibles con las clases serializables.

  • @Contextual Para marcar la propiedad BSON id y usar la propiedad integrada ObjectIdSerializer. Esta anotación es necesaria para que los tipos BSON se serialicen correctamente.

@Serializable
data class PaintOrder(
@SerialName("_id") // Use instead of @BsonId
@Contextual val id: ObjectId?,
val color: String,
val qty: Int,
@SerialName("brand")
val manufacturer: String = "Acme" // Use instead of @BsonProperty
)

Nota

No se pueden utilizar anotaciones del org.bson.codecs.pojo.annotations paquete en @Serializable clases de datos.

Para obtener más información sobre las clases serializables y las clases de anotación disponibles,consulte la documentación oficial de serialización de Kotlin.

Puedes crear un serializador personalizado para gestionar la representación de tus datos en BSON. El controlador Kotlin utiliza la interfaz KSerializer del paquete kotlinx.serialization para implementar serializadores personalizados. Puedes especificar el serializador personalizado como parámetro de la anotación @Serializable para un campo específico.

El siguiente ejemplo muestra cómo crear una instancia KSerializer personalizada para convertir un kotlin.time.Instant en un BsonDateTime:

object InstantAsBsonDateTime : KSerializer<Instant> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("InstantAsBsonDateTime", PrimitiveKind.LONG)
override fun serialize(encoder: Encoder, value: Instant) {
when (encoder) {
is BsonEncoder -> encoder.encodeBsonValue(BsonDateTime(value.toEpochMilliseconds()))
else -> throw SerializationException("Instant is not supported by ${encoder::class}")
}
}
override fun deserialize(decoder: Decoder): Instant {
return when (decoder) {
is BsonDecoder -> Instant.fromEpochMilliseconds(decoder.decodeBsonValue().asDateTime().value)
else -> throw SerializationException("Instant is not supported by ${decoder::class}")
}
}
}

El siguiente código muestra la clase de datos PaintOrder en la que el campo orderDate tiene una anotación que especifica la clase de serializador personalizado definida en el código anterior:

@Serializable
data class PaintOrder(
val color: String,
val qty: Int,
@Serializable(with = InstantAsBsonDateTime::class)
val orderDate: Instant,
)

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de API:

Puede utilizar la clase KotlinSerializerCodec del paquete org.bson.codecs.kotlinx para crear un códec para sus clases de datos @Serializable y personalizar lo que se almacena.

Utilice la clase BsonConfiguration para definir la configuración, incluso si desea codificar valores predeterminados, codificar valores nulos o definir discriminadores de clase.

Para crear un códec personalizado, instale la dependencia bson-kotlinx en su proyecto. Seleccione una de las siguientes pestañas para ver cómo agregar la dependencia a su proyecto usando los administradores de paquetes Gradle y Maven:

Si está utilizando Gradle para administrar sus dependencias, agregue lo siguiente a su build.gradle.kts lista de dependencias:

construir.gradle.kts
implementation("org.mongodb:bson-kotlinx:5.0.0")

Si está utilizando Maven para administrar sus dependencias, agregue lo siguiente a su pom.xml lista de dependencias:

pom.xml
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>bson-kotlinx</artifactId>
<version>5.0.0</version>
</dependency>

Nota

Dependencia de bson-kotlin

También puede instalar opcionalmente la bson-kotlin dependencia a través del registro de códecs predeterminado. Esta dependencia utiliza la reflexión y el registro de códecs para admitir las clases de datos de Kotlin, pero no admite ciertas anotaciones POJO BsonDiscriminator BsonExtraElementscomo,BsonConstructor y. Para obtener más información, consulte la documentación de la API bson-kotlin.

En general, recomendamos que instale y utilice la biblioteca bson-kotlinx más rápida para la configuración del códec.

Luego, puede definir su códec utilizando el método KotlinSerializerCodec.create() y agregarlo al registro.

El siguiente ejemplo muestra cómo crear un códec utilizando el método KotlinSerializerCodec.create() y configurarlo para no codificar valores predeterminados:

import org.bson.codecs.configuration.CodecRegistries
import org.bson.codecs.kotlinx.BsonConfiguration
import org.bson.codecs.kotlinx.KotlinSerializerCodec
val myCustomCodec = KotlinSerializerCodec.create<PaintOrder>(
bsonConfiguration = BsonConfiguration(encodeDefaults = false)
)
val registry = CodecRegistries.fromRegistries(
CodecRegistries.fromCodecs(myCustomCodec), collection.codecRegistry
)

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de API:

Volver

Documentos

En esta página