Oleh Havrysh
01/31/2023, 4:33 PMSmallPersistentVector
which is internal
BTW) and generic (<E>
forList items)
So what I have now:
class PersistentListSerializer<T>(elementSerializer: KSerializer<T>) : KSerializer<PersistentList<T>> {
private val listSerializer = ListSerializer(elementSerializer)
override val descriptor: SerialDescriptor = listSerializer.descriptor
override fun serialize(encoder: Encoder, value: PersistentList<T>) {
listSerializer.serialize(encoder, value)
}
override fun deserialize(decoder: Decoder): PersistentList<T> =
listSerializer.deserialize(decoder).toPersistentList()
}
I'll have a lot of usages among the UI entities in my app (I use PersistentList for Compose), so wanted to define serializer in the single place where I save the state:
private val json = Json {
serializersModule = SerializersModule {
polymorphic(PersistentList::class) {
subclass(SmallPersistentVector::class) // can't access since it's internal
}
contextual(PersistentList::class) { PersistentListSerializer(it.first()) } // doesn't work because in runtime it receives SmallPersistentVector, not PersistentList
}
}
phldavies
01/31/2023, 5:14 PM@file:UseSerializers(PersistentListSerializer::class)
or @Serializable(with = PersistentListSerializer::class)
on the property, or using typealias SerializablePersistentList<T> = @Serializable(with = PersistentListSerializer::class) PersistentList<T>
as an example@file:UseSerializers(PersistentListSerializer::class)
in file that defines a @Serializable
class that uses PersistentList
Oleh Havrysh
02/01/2023, 8:59 AMpdvrieze
02/01/2023, 2:34 PMSerialDescriptor
with the new name and base descriptor).