[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,13 +128,17 @@ 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 {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter) contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter) contextual(BigInteger::class, BigIntegerAdapter)
{{^kotlinx-datetime}} {{^kotlinx-datetime}}
@ -147,21 +153,45 @@ import java.util.concurrent.atomic.AtomicLong
contextual(URI::class, URIAdapter) contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter) contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter) 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,13 +17,17 @@ 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 {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter) contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter) contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter) contextual(LocalDate::class, LocalDateAdapter)
@ -34,20 +40,44 @@ object Serializer {
contextual(URI::class, URIAdapter) contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter) contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter) 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,13 +17,17 @@ 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 {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter) contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter) contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter) contextual(LocalDate::class, LocalDateAdapter)
@ -34,20 +40,44 @@ object Serializer {
contextual(URI::class, URIAdapter) contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter) contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter) 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,13 +17,17 @@ 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 {
isAdaptersInitialized = true
SerializersModule {
contextual(BigDecimal::class, BigDecimalAdapter) contextual(BigDecimal::class, BigDecimalAdapter)
contextual(BigInteger::class, BigIntegerAdapter) contextual(BigInteger::class, BigIntegerAdapter)
contextual(LocalDate::class, LocalDateAdapter) contextual(LocalDate::class, LocalDateAdapter)
@ -34,20 +40,44 @@ object Serializer {
contextual(URI::class, URIAdapter) contextual(URI::class, URIAdapter)
contextual(URL::class, URLAdapter) contextual(URL::class, URLAdapter)
contextual(StringBuilder::class, StringBuilderAdapter) 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
}
} }