[kotlin][client] make kotlinx serialization configurable (#20955)

* [kotlin][client] make kotlinx serialization configurable from outside

* [kotlin][client] make kotlinx serialization configurable from outside
This commit is contained in:
Bruno Coelho 2025-03-26 10:19:24 +00:00 committed by GitHub
parent 11c56117d2
commit 701b6bd576
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 182 additions and 62 deletions

View File

@ -50,7 +50,9 @@ import org.threeten.bp.OffsetDateTime
{{/threetenbp}}
import java.util.UUID
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonBuilder
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.SerializersModuleBuilder
import java.net.URI
import java.net.URL
import java.util.concurrent.atomic.AtomicBoolean
@ -126,42 +128,70 @@ import java.util.concurrent.atomic.AtomicLong
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}})
{{/jackson}}
{{#kotlinx_serialization}}
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
@JvmStatic
val kotlinSerializationAdapters: SerializersModule
get() { return kotlinxSerializationAdapters }
private var isAdaptersInitialized = false
@JvmStatic
val kotlinxSerializationAdapters = SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
{{^kotlinx-datetime}}
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
{{/kotlinx-datetime}}
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
val kotlinxSerializationAdapters: SerializersModule by lazy {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
{{^kotlinx-datetime}}
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
{{/kotlinx-datetime}}
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
apply(kotlinxSerializationAdaptersConfiguration)
}
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
set(value) {
check(!isAdaptersInitialized) {
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
}
field = value
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
@JvmStatic
val jvmJson: Json
get() { return kotlinxSerializationJson }
private var isJsonInitialized = false
@JvmStatic
val kotlinxSerializationJson: Json by lazy {
isJsonInitialized = true
Json {
serializersModule = kotlinxSerializationAdapters
encodeDefaults = true
ignoreUnknownKeys = true
isLenient = true
apply(kotlinxSerializationJsonConfiguration)
}
}
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
set(value) {
check(!isJsonInitialized) {
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
}
field = value
}
{{/kotlinx_serialization}}
}

View File

@ -7,7 +7,9 @@ import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.util.UUID
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonBuilder
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.SerializersModuleBuilder
import java.net.URI
import java.net.URL
import java.util.concurrent.atomic.AtomicBoolean
@ -15,39 +17,67 @@ import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicLong
object Serializer {
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
@JvmStatic
val kotlinSerializationAdapters: SerializersModule
get() { return kotlinxSerializationAdapters }
private var isAdaptersInitialized = false
@JvmStatic
val kotlinxSerializationAdapters = SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
val kotlinxSerializationAdapters: SerializersModule by lazy {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
apply(kotlinxSerializationAdaptersConfiguration)
}
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
set(value) {
check(!isAdaptersInitialized) {
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
}
field = value
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
@JvmStatic
val jvmJson: Json
get() { return kotlinxSerializationJson }
private var isJsonInitialized = false
@JvmStatic
val kotlinxSerializationJson: Json by lazy {
isJsonInitialized = true
Json {
serializersModule = kotlinxSerializationAdapters
encodeDefaults = true
ignoreUnknownKeys = true
isLenient = true
apply(kotlinxSerializationJsonConfiguration)
}
}
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
set(value) {
check(!isJsonInitialized) {
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
}
field = value
}
}

View File

@ -7,7 +7,9 @@ import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.util.UUID
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonBuilder
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.SerializersModuleBuilder
import java.net.URI
import java.net.URL
import java.util.concurrent.atomic.AtomicBoolean
@ -15,39 +17,67 @@ import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicLong
object Serializer {
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
@JvmStatic
val kotlinSerializationAdapters: SerializersModule
get() { return kotlinxSerializationAdapters }
private var isAdaptersInitialized = false
@JvmStatic
val kotlinxSerializationAdapters = SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
val kotlinxSerializationAdapters: SerializersModule by lazy {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
apply(kotlinxSerializationAdaptersConfiguration)
}
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
set(value) {
check(!isAdaptersInitialized) {
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
}
field = value
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
@JvmStatic
val jvmJson: Json
get() { return kotlinxSerializationJson }
private var isJsonInitialized = false
@JvmStatic
val kotlinxSerializationJson: Json by lazy {
isJsonInitialized = true
Json {
serializersModule = kotlinxSerializationAdapters
encodeDefaults = true
ignoreUnknownKeys = true
isLenient = true
apply(kotlinxSerializationJsonConfiguration)
}
}
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
set(value) {
check(!isJsonInitialized) {
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
}
field = value
}
}

View File

@ -7,7 +7,9 @@ import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.util.UUID
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonBuilder
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.SerializersModuleBuilder
import java.net.URI
import java.net.URL
import java.util.concurrent.atomic.AtomicBoolean
@ -15,39 +17,67 @@ import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicLong
object Serializer {
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
@JvmStatic
val kotlinSerializationAdapters: SerializersModule
get() { return kotlinxSerializationAdapters }
private var isAdaptersInitialized = false
@JvmStatic
val kotlinxSerializationAdapters = SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
val kotlinxSerializationAdapters: SerializersModule by lazy {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(UUID::class, UUIDAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(AtomicLong::class, AtomicLongAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter)
apply(kotlinxSerializationAdaptersConfiguration)
}
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
set(value) {
check(!isAdaptersInitialized) {
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
}
field = value
}
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
@JvmStatic
val jvmJson: Json
get() { return kotlinxSerializationJson }
private var isJsonInitialized = false
@JvmStatic
val kotlinxSerializationJson: Json by lazy {
isJsonInitialized = true
Json {
serializersModule = kotlinxSerializationAdapters
encodeDefaults = true
ignoreUnknownKeys = true
isLenient = true
apply(kotlinxSerializationJsonConfiguration)
}
}
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
set(value) {
check(!isJsonInitialized) {
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
}
field = value
}
}