0

I'm trying to serialize an object into json format using encodeToJsonElement.

import kotlinx.serialization.ContextualSerializer
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.encodeToJsonElement
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.serializer

@Serializable
data class Person(
  val name: String
)

@OptIn(ExperimentalSerializationApi::class)
private val json = Json {
  SerializersModule {
    contextual(Any::class, DynamicLookupSerializer)
  }
}

fun main() {
  f(Person("jack"))
}

fun f(data: Any) {
  val d = json.encodeToJsonElement(data)
}

@ExperimentalSerializationApi
object DynamicLookupSerializer : KSerializer<Any> {
  override val descriptor: SerialDescriptor =
    ContextualSerializer(Any::class, null, emptyArray()).descriptor

  @OptIn(InternalSerializationApi::class)
  override fun serialize(encoder: Encoder, value: Any) {
    val actualSerializer =
      encoder.serializersModule.getContextual(value::class) ?: value::class.serializer()
    encoder.encodeSerializableValue(actualSerializer as KSerializer<Any>, value)
  }

  override fun deserialize(decoder: Decoder): Any {
    error("Unsupported")
  }
}

but this doesn't work.

Exception in thread "main" kotlinx.serialization.SerializationException: Serializer for class 'Any' is not found.
Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.
SageJustus
  • 631
  • 3
  • 9

0 Answers0