My class looks like this:
@Serializable(with = ItemSerializer::class)
class Item<E>(
val id: ItemId,
val elem: E,
)
But when I try to use it, I get error
Serializer for class 'Item' is not found. Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.
How to write Serializer for class Item and use it?
I try to write my own serializer, but I still get issue:
@OptIn(ExperimentalSerializationApi::class)
@Serializer(forClass = Item::class)
class ItemSerializer<E>(private val serializer: KSerializer<E>) : KSerializer<Item<E>> {
override val descriptor: SerialDescriptor =
buildClassSerialDescriptor("Item") {
element("id", String.serializer().descriptor)
element("elem", serializer.descriptor)
}
override fun serialize(encoder: Encoder, value: Item<E>) {
encoder.encodeStructure(descriptor) {
encodeStringElement(descriptor, 0, value.id)
encodeSerializableElement(descriptor, 1, serializer, value.elem)
}
}
override fun deserialize(decoder: Decoder): Item<E> {
var id: String? = null
var elem: E? = null
decoder.decodeStructure(descriptor) {
while (true) {
when (val index = decodeElementIndex(descriptor)) {
0 -> id = decodeStringElement(descriptor, 0)
1 -> elem = decodeSerializableElement(descriptor, 1, serializer)
CompositeDecoder.DECODE_DONE -> break
else -> error("Unexpected index: $index")
}
}
}
return Item(id ?: error("Missing required field 'id'"), elem ?: error("Missing required field 'elem'"))
}
}