Visão geral
O driver do Kotlin suporta a biblioteca kotlinx.serialization
para serializar e desserializar objetos do Kotlin.
O driver fornece um serializador Bson
eficiente que você pode usar com classes marcadas como @Serializable
para lidar com a serialização de objetos Kotlin em dados BSON.
Você também pode instalar a biblioteca bson-kotlinx
para oferecer suporte a codecs personalizados com configurações para codificar padrões, codificar nulos e definir discriminadores de classe.
Observação
Para saber como usar a interface Codec
em vez da biblioteca de serialização Kotlin para especificar a codificação e a decodificação personalizadas de objetos Kotlin para dados BSON, consulte o guiaCodecs .
Você pode escolher a serialização do Kotlin se já estiver familiarizado com a estrutura ou se preferir usar uma abordagem idiomática do Kotlin.
Embora você possa usar o driver Kotlin com a biblioteca de Json
de serialização Kotlin, o serializador Json
não oferece suporte direto a tipos de valor BSON, como ObjectId
. Você deve fornecer um serializador personalizado que possa lidar com a conversão entre BSON e JSON.
Tipos suportados
O driver Kotlin suporta:
Todos os tipos de Kotlin suportados pela biblioteca de serialização de Kotlin
Todos os tipos de BSONdisponíveis
Adicionar serialização de Kotlin ao seu projeto
O suporte para serialização no driver Kotlin depende da biblioteca oficial de serialização do Kotlin .
Selecione uma das abas abaixo para ver como adicionar as dependências de serialização ao seu projeto usando os gerenciadores de pacotes Gradle e Maven:
Se você estiver usando o Gradle para gerenciar suas dependências, adicione o seguinte à sua build.gradle.kts
lista de dependências do :
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.0") implementation("org.mongodb:bson-kotlinx:5.0.0")
Se você estiver usando o Maven para gerenciar suas dependências, adicione o seguinte à sua pom.xml
lista de dependências do :
<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>
Anotar classes de dados
Para declarar uma classe como serializável, anote suas classes de dados do Kotlin com a anotação @Serializable
da estrutura de serialização do Kotlin.
Você pode utilizar suas classes de dados em seu código normalmente após marcá-las como serializáveis. O driver do Kotlin e a estrutura de serialização do Kotlin gereciam a serialização e desserialização do BSON.
Este exemplo mostra uma classe de dados simples anotada com o seguinte:
@Serializable
para marcar a classe como serializável.@SerialName
para especificar o nome das propriedadesid
emanufacturer
no documento BSON. Pode ser usado no lugar das anotações do@BsonId
e@BsonProperty
, que não são compatíveis com classes serializáveis.@Contextual
para marcar a propriedade BSONid
para utilizar oObjectIdSerializer
embutido. Esta anotação é necessária para que os tipos BSON sejam serializados corretamente.
data class PaintOrder( // Use instead of @BsonId val id: ObjectId?, val color: String, val qty: Int, val manufacturer: String = "Acme" // Use instead of @BsonProperty )
Observação
Você não pode utilizar anotações do pacote org.bson.codecs.pojo.annotations
em classes de dados do @Serializable
.
Para mais informações sobre classes serializáveis e classes de anotação disponíveis, consulte a documentação Serialização oficial de Kotlin.
Exemplo de serializador personalizado
Você pode criar um serializador personalizado para gerenciar como seus dados são representados em BSON. O driver do Kotlin usa a interface do KSerializer
do pacote kotlinx.serialization
para implementar serializadores personalizados. Você pode especificar o serializador personalizado como o parâmetro para a anotação @Serializable
para um campo específico.
O exemplo abaixo mostra como criar uma instância personalizada do KSerializer
para converter um kotlinx.datetime.Instant
para um 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}") } } }
O código abaixo mostra a classe de dados PaintOrder
na qual o campo orderDate
tem uma anotação que especifica a classe de serializador personalizado definida no código anterior:
data class PaintOrder( val color: String, val qty: Int, val orderDate: Instant, )
Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:
Personalizar a Configuração do Serializador
Você pode utilizar a classe KotlinSerializerCodec
do pacote org.bson.codecs.kotlinx
para criar um codec para suas classes de dados do @Serializable
e personalizar o que é armazenado.
Use a classe BsonConfiguration
para definir a configuração, incluindo se deseja codificar padrões, codificar nulos ou definir discriminadores de classe.
Para criar um codec personalizado, instale a dependência do bson-kotlinx
no seu projeto. Selecione uma das abas abaixo para ver como adicionar a dependência ao seu projeto usando os gerenciadores de pacotes Gradle e Maven:
Se você estiver usando o Gradle para gerenciar suas dependências, adicione o seguinte à sua build.gradle.kts
lista de dependências do :
implementation("org.mongodb:bson-kotlinx:5.0.0")
Se você estiver usando o Maven para gerenciar suas dependências, adicione o seguinte à sua pom.xml
lista de dependências do :
<dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>bson-kotlinx</artifactId> <version>5.0.0</version> </dependency>
Observação
bson-kotlin Dependency
Você também pode opcionalmente instalar a dependência do bson-kotlin
através do registro de codec padrão. Essa dependência usa a reflexão e o registro do codec para oferecer suporte a classes de dados Kotlin, mas não oferece suporte a determinadas anotações POJO, como BsonDiscriminator
, BsonExtraElements
e BsonConstructor
. Para saber mais, consulte a documentação da API bson-kotlin.
Geralmente, recomendamos que instale e utilize a biblioteca bson-kotlinx
mais rápida para configuração de codec.
Em seguida, você pode definir seu codec usando o método KotlinSerializerCodec.create() e adicioná-lo ao registro.
Exemplo de codec personalizado
O exemplo seguinte mostra como criar um codec utilizando o método KotlinSerializerCodec.create()
e configurá-lo para não codificar padrões:
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 obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API: