nschulzke
08/13/2021, 3:51 PM// in package com.example.platform
interface Event
// in package com.example.customer
@Serializable
sealed class CustomerEvent : Event {
object CustomerEvent1
...
}
// in package com.example.supplier
@Serializable
sealed class SupplierEvent : Event {
object SupplierEvent1
...
}
I would like to be able to serialize/deserialize Event
, but I don't really want to have all the event trees in one package, so using one big sealed class
hierarchy doesn't work well.
Does anyone have any idea how to go about registering Event
as polymorphically serializable?nschulzke
08/13/2021, 3:51 PMEvent
as polymorphic:
SerializersModule {
polymorphic(Event::class) {
subclass(CustomerEvent::class, CustomerEvent.serializer())
subclass(SupplierEvent::class, SupplierEvent.serializer())
}
}
But I get this error:
Serializer for Event can't be registered as a subclass for polymorphic serialization because its kind SEALED is not concrete. To work with multiple hierarchies, register it as a base class.
nschulzke
08/13/2021, 3:53 PMpolymorphic
block, but there are dozens of them and that's liable to get forgotten over time as we add more.Fudge
08/13/2021, 5:16 PMFudge
08/13/2021, 5:17 PMFudge
08/13/2021, 5:20 PMDominaezzz
08/13/2021, 5:23 PMpolymorphic
for each subclass, as Fudge says)ephemient
08/13/2021, 6:12 PMnschulzke
08/13/2021, 8:18 PMephemient
08/14/2021, 3:04 AMephemient
08/14/2021, 3:07 AMephemient
08/14/2021, 3:08 AM+
them all together; that way the various polymorphic(...)
registrations are closer to the declarations, e.g.
// in package com.example.customer
val serializersModule = SerializersModule {
polymorphic(Event::class, CustomerEvent.CustomerEvent1::class, CustomerEvent.CustomerEvent1.serializer())
}
// in package com.example.supplier
val serializersModule = SerializersModule {
polymorphic(Event::class, SupplierEvent.SupplierEvent1::class, SupplierEvent.SupplierEvent1.serializer())
}
// at serialization usage site
val json = Json {
serializersModule = com.example.customer.serializersModule + com.example.supplier.serializersModule
}