Hi, I have followed a <tutorial> to create a custo...
# serialization
s
Hi, I have followed a tutorial to create a custom serialization for my generic class. But i am still stacked with error:
Copy code
SerializationException: Serializer for class 'ApiResponse' is not found. Mark the class as @Serializable or provide the serializer explicitly.
My
ApiResponse
class looks like this:
Copy code
@Serializable(with = ApiResponseSerializer::class)
class ApiResponse<T>(
    @SerialName("data")
    val data: T? = null,
    @SerialName("error")
    val error: ApiError? = null
)
And
ApiResponseSerializer
, that is used in annotation above is:
Copy code
class ApiResponseSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<ApiResponse<T>> {
    
    override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ApiResponseDataSerializer") {
        val dataDescriptor = dataSerializer.descriptor
        element("data", dataDescriptor)
        element("error", ApiError.serializer().descriptor)
    }
    
    override fun deserialize(decoder: Decoder): ApiResponse<T> =
        decoder.decodeStructure(descriptor) {
            var data: T? = null
            var error: ApiError? = null
            loop@ while (true) {
                when (val i = decodeElementIndex(descriptor)) {
                    0 -> data = decodeSerializableElement(descriptor, i, dataSerializer)
                    1 -> error = decodeSerializableElement(descriptor, i, ApiError.serializer())
                    CompositeDecoder.DECODE_DONE -> break
                    else -> throw SerializationException("Unknown index $i")
                }
            }
            ApiResponse(data, error)
        }
        
    override fun serialize(encoder: Encoder, value: ApiResponse<T>) {
        encoder.encodeStructure(descriptor) {
            encodeNullableSerializableElement(descriptor, 0, dataSerializer, value.data)
            encodeNullableSerializableElement(descriptor, 1, ApiError.serializer(), value.error)
        }
    }
}
Then, when i’m trying to serialise my data object, i receive an exception I’ve mentioned above.
Copy code
Json.encodeToString(ApiResponse(data = response.data))
---- OR ----
Json.encodeToString(ApiResponse.serializer(T::class.serializer()), ApiResponse(data = response.data))
Can someone tell me where i’m wrong? Thank you.
a
Have you added
kotlin("plugin.serialization")
into build.gradle(.kts) file? It has to be added into each
build.gradle.kts
file
s
yeah yeah, i solved it by restarting IDEA. i guess it was caused by “bad” cache. Topic is closed, thank you 🙂