11package org.axonframework.extensions.kotlin.serialization
22
3- import kotlinx.serialization.ExperimentalSerializationApi
43import kotlinx.serialization.KSerializer
54import kotlinx.serialization.builtins.MapSerializer
65import kotlinx.serialization.builtins.serializer
76import kotlinx.serialization.descriptors.SerialDescriptor
8- import kotlinx.serialization.descriptors.mapSerialDescriptor
7+ import kotlinx.serialization.descriptors.buildClassSerialDescriptor
98import kotlinx.serialization.encoding.Decoder
109import kotlinx.serialization.encoding.Encoder
1110import kotlinx.serialization.json.*
1211import org.axonframework.messaging.MetaData
1312
13+
1414object MetaDataSerializer : KSerializer<MetaData> {
15- private val json = Json { encodeDefaults = true ; ignoreUnknownKeys = true }
1615
17- private val mapSerializer = MapSerializer (
18- keySerializer = String .serializer(),
19- valueSerializer = JsonElement .serializer()
20- )
16+ private val json = Json { encodeDefaults = true ; ignoreUnknownKeys = true }
2117
22- @OptIn(ExperimentalSerializationApi ::class )
23- override val descriptor: SerialDescriptor = mapSerialDescriptor(
24- String .serializer().descriptor,
25- JsonElement .serializer().descriptor
26- )
18+ override val descriptor: SerialDescriptor = String .serializer().descriptor
2719
2820 override fun serialize (encoder : Encoder , value : MetaData ) {
29- val jsonMap = value.entries.associate { (key, rawValue) ->
21+ val map : Map < String , JsonElement > = value.entries.associate { (key, rawValue) ->
3022 key to toJsonElement(rawValue)
3123 }
32- encoder.encodeSerializableValue(mapSerializer, jsonMap)
24+ val jsonString = json.encodeToString(MapSerializer (String .serializer(), JsonElement .serializer()), map)
25+ encoder.encodeSerializableValue(String .serializer(), jsonString)
3326 }
3427
3528 override fun deserialize (decoder : Decoder ): MetaData {
36- val map = decoder.decodeSerializableValue(mapSerializer)
37- val restored = map.mapValues { (_, jsonElement) -> fromJsonElement(jsonElement) }
38- return MetaData (restored)
29+ val jsonString = decoder.decodeSerializableValue(String .serializer())
30+ val map = json.decodeFromString(MapSerializer (String .serializer(), JsonElement .serializer()), jsonString)
31+ val reconstructed = map.mapValues { (_, jsonElement) -> fromJsonElement(jsonElement) }
32+ return MetaData (reconstructed)
3933 }
4034
4135 private fun toJsonElement (value : Any? ): JsonElement = when (value) {
4236 null -> JsonNull
4337 is String -> JsonPrimitive (value)
38+ is Boolean -> JsonPrimitive (value)
4439 is Int -> JsonPrimitive (value)
4540 is Long -> JsonPrimitive (value)
46- is Double -> JsonPrimitive (value)
4741 is Float -> JsonPrimitive (value)
48- is Boolean -> JsonPrimitive (value)
42+ is Double -> JsonPrimitive (value)
43+ is Map <* , * > -> JsonObject (value.entries.associate { (k, v) -> k.toString() to toJsonElement(v) })
4944 is List <* > -> JsonArray (value.map { toJsonElement(it) })
50- is Map <* , * > -> JsonObject (
51- value.entries.associate { (k, v) ->
52- k.toString() to toJsonElement(v)
53- }
54- )
55- else -> JsonPrimitive (value.toString()) // Fallback toString()
45+ else -> JsonPrimitive (value.toString())
5646 }
5747
5848 private fun fromJsonElement (element : JsonElement ): Any? = when (element) {
@@ -69,4 +59,20 @@ object MetaDataSerializer : KSerializer<MetaData> {
6959 is JsonObject -> element.mapValues { fromJsonElement(it.value) }
7060 is JsonArray -> element.map { fromJsonElement(it) }
7161 }
62+ }
63+
64+ object JsonElementSerializer : KSerializer<JsonElement> {
65+ private val json = Json { encodeDefaults = true }
66+
67+ override val descriptor: SerialDescriptor = buildClassSerialDescriptor(" kotlinx.serialization.json.JsonElement" )
68+
69+ override fun serialize (encoder : Encoder , value : JsonElement ) {
70+ val jsonString = json.encodeToString(JsonElement .serializer(), value)
71+ encoder.encodeString(jsonString)
72+ }
73+
74+ override fun deserialize (decoder : Decoder ): JsonElement {
75+ val jsonString = decoder.decodeString()
76+ return json.decodeFromString(JsonElement .serializer(), jsonString)
77+ }
7278}
0 commit comments