|
1 | 1 | package com.github.kagkarlsson.examples.kotlin
|
2 | 2 |
|
3 | 3 | import com.github.kagkarlsson.scheduler.serializer.Serializer
|
| 4 | +import kotlinx.serialization.ExperimentalSerializationApi |
4 | 5 | import kotlinx.serialization.KSerializer
|
5 | 6 | import kotlinx.serialization.json.Json
|
| 7 | +import kotlinx.serialization.json.JsonElement |
6 | 8 | import kotlinx.serialization.serializer
|
| 9 | +import java.nio.charset.Charset |
7 | 10 | import java.nio.charset.StandardCharsets
|
8 | 11 |
|
| 12 | +@OptIn(ExperimentalSerializationApi::class) |
9 | 13 | class KotlinSerializer : Serializer {
|
10 |
| - val CHARSET = StandardCharsets.UTF_8 |
| 14 | + private val charset: Charset = StandardCharsets.UTF_8 |
11 | 15 |
|
12 |
| - override fun serialize(data: Any): ByteArray { |
| 16 | + override fun serialize(data: Any?): ByteArray { |
| 17 | + if (data == null) { |
| 18 | + return ByteArray(0) |
| 19 | + } |
13 | 20 | val serializer = serializer(data.javaClass)
|
14 |
| - return Json.encodeToString(serializer, data).toByteArray(CHARSET); |
| 21 | + return Json.encodeToString(serializer, data).toByteArray(charset); |
15 | 22 | }
|
16 | 23 |
|
17 |
| - override fun <T : Any?> deserialize(clazz: Class<T>, serializedData: ByteArray): T { |
| 24 | + @Suppress("UNCHECKED_CAST") |
| 25 | + override fun <T : Any?> deserialize(clazz: Class<T>, serializedData: ByteArray?): T? { |
| 26 | + if (serializedData == null || clazz == Void::class.java) { |
| 27 | + return null |
| 28 | + } |
| 29 | + |
| 30 | + // If we do not know the class (e.g. java.lang.Object), decode as generic JSON |
| 31 | + if (clazz == Any::class.java) { |
| 32 | + return Json.decodeFromString(JsonElement.serializer(), serializedData.decodeToString()) as T |
| 33 | + } |
| 34 | + |
18 | 35 | // Hackish workaround?
|
19 | 36 | // https://github.com/Kotlin/kotlinx.serialization/issues/1134
|
20 | 37 | // https://stackoverflow.com/questions/64284767/replace-jackson-with-kotlinx-serialization-in-javalin-framework/64285478#64285478
|
21 | 38 |
|
22 | 39 | val deserializer = serializer(clazz) as KSerializer<T>
|
23 |
| - return Json.decodeFromString(deserializer, String(serializedData, CHARSET)) |
| 40 | + return Json.decodeFromString(deserializer, String(serializedData, charset)) |
24 | 41 | }
|
25 | 42 | }
|
0 commit comments