I get:
SerializationException: Class 'Porsche' is not registered for polymorphic serialization in the scope of 'SdkExtraData'. Mark the base class as 'sealed' or register the serializer explicitly.
This is the GitHub repo to reproduce the ussue: https://github.com/lalongooo/kotlin-serialization-issue
I have 3 modules :sdk-api
, :sdk
, :app
, with their corresponding classes:
An Android library module:sdk-api
class SdkApi<EventData : Any> constructor(
private val eventDataKClass: KClass<EventData>,
private val appSerializersModule: SerializersModule
) {
private val json by lazy {
Json {
serializersModule = appSerializersModule
}
}
@OptIn(InternalSerializationApi::class)
fun send(event: EventData) {
val element = encodeToJsonElement(eventDataKClass.serializer(), event)
val jsonString = json.encodeToString(element)
println(jsonString)
}
}
An Android library module :sdk
:
@Serializable
abstract class SdkExtraData // I have tried making this an interface
@Serializable
class Action(
private val foo: String,
private val extraData: SdkExtraData? = null
)
class Sdk constructor(private val sdkApi: SdkApi<Action>) {
companion object {
fun create(
projectSerializersModule: SerializersModule
): Sdk {
val sdkApi = SdkApi(Action::class, projectSerializersModule)
return Sdk(sdkApi)
}
}
fun sendAction(action: Action) {
sdkApi.send(action)
}
}
An Android app module: :app
:
@Serializable
data class Porsche(
private val model: String,
private val generation: Int
) : SdkExtraData()
private fun buildSerializersModule() = SerializersModule {
polymorphic(SdkExtraData::class) {
subclass(Porsche::class)
}
}
// This runs during an Activity's `onCreate` for testing purposes:
private fun serializeStuff() {
val action = Action(
foo = "Android",
extraData = Porsche(model = "911", generation = 992)
)
val module = buildSerializersModule()
val sdk = Sdk.create(module)
sdk.sendAction(action)
}
If there's an alternative to not use SerializerModule
, I'm up for it.