[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}} {{/threetenbp}}
import java.util.UUID import java.util.UUID
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonBuilder
import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.SerializersModuleBuilder
import java.net.URI import java.net.URI
import java.net.URL import java.net.URL
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
@ -126,42 +128,70 @@ import java.util.concurrent.atomic.AtomicLong
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}}) .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}})
{{/jackson}} {{/jackson}}
{{#kotlinx_serialization}} {{#kotlinx_serialization}}
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters")) @Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
@JvmStatic @JvmStatic
val kotlinSerializationAdapters: SerializersModule val kotlinSerializationAdapters: SerializersModule
get() { return kotlinxSerializationAdapters } get() { return kotlinxSerializationAdapters }
private var isAdaptersInitialized = false
@JvmStatic @JvmStatic
val kotlinxSerializationAdapters = SerializersModule { val kotlinxSerializationAdapters: SerializersModule by lazy {
contextual(BigDecimal::class, BigDecimalAdapter) isAdaptersInitialized = true
contextual(BigInteger::class, BigIntegerAdapter) SerializersModule {
{{^kotlinx-datetime}} contextual(BigDecimal::class, BigDecimalAdapter)
contextual(LocalDate::class, LocalDateAdapter) contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDateTime::class, LocalDateTimeAdapter) {{^kotlinx-datetime}}
contextual(OffsetDateTime::class, OffsetDateTimeAdapter) contextual(LocalDate::class, LocalDateAdapter)
{{/kotlinx-datetime}} contextual(LocalDateTime::class, LocalDateTimeAdapter)
contextual(UUID::class, UUIDAdapter) contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
contextual(AtomicInteger::class, AtomicIntegerAdapter) {{/kotlinx-datetime}}
contextual(AtomicLong::class, AtomicLongAdapter) contextual(UUID::class, UUIDAdapter)
contextual(AtomicBoolean::class, AtomicBooleanAdapter) contextual(AtomicInteger::class, AtomicIntegerAdapter)
contextual(URI::class, URIAdapter) contextual(AtomicLong::class, AtomicLongAdapter)
contextual(URL::class, URLAdapter) contextual(AtomicBoolean::class, AtomicBooleanAdapter)
contextual(StringBuilder::class, StringBuilderAdapter) 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 @JvmStatic
val jvmJson: Json val jvmJson: Json
get() { return kotlinxSerializationJson } get() { return kotlinxSerializationJson }
private var isJsonInitialized = false
@JvmStatic @JvmStatic
val kotlinxSerializationJson: Json by lazy { val kotlinxSerializationJson: Json by lazy {
isJsonInitialized = true
Json { Json {
serializersModule = kotlinxSerializationAdapters serializersModule = kotlinxSerializationAdapters
encodeDefaults = true encodeDefaults = true
ignoreUnknownKeys = true ignoreUnknownKeys = true
isLenient = 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}} {{/kotlinx_serialization}}
} }

View File

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