
com.jakewharton.retrofit2.converter.kotlinx.serialization.Serializer.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of retrofit2-kotlinx-serialization-converter Show documentation
Show all versions of retrofit2-kotlinx-serialization-converter Show documentation
A Converter.Factory for Kotlin's serialization support.
package com.jakewharton.retrofit2.converter.kotlinx.serialization
import java.lang.reflect.Type
import kotlinx.serialization.BinaryFormat
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialFormat
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.StringFormat
import kotlinx.serialization.serializer
import okhttp3.MediaType
import okhttp3.RequestBody
import okhttp3.ResponseBody
internal sealed class Serializer {
abstract fun fromResponseBody(loader: DeserializationStrategy, body: ResponseBody): T
abstract fun toRequestBody(contentType: MediaType, saver: SerializationStrategy, value: T): RequestBody
@OptIn(ExperimentalSerializationApi::class) // Experimental is only for subtypes.
protected abstract val format: SerialFormat
@ExperimentalSerializationApi // serializer(Type) is not stable.
fun serializer(type: Type): KSerializer = format.serializersModule.serializer(type)
@OptIn(ExperimentalSerializationApi::class) // Experimental is only for subtypes.
class FromString(override val format: StringFormat) : Serializer() {
override fun fromResponseBody(loader: DeserializationStrategy, body: ResponseBody): T {
val string = body.string()
return format.decodeFromString(loader, string)
}
override fun toRequestBody(contentType: MediaType, saver: SerializationStrategy, value: T): RequestBody {
val string = format.encodeToString(saver, value)
return RequestBody.create(contentType, string)
}
}
@OptIn(ExperimentalSerializationApi::class) // Experimental is only for subtypes.
class FromBytes(override val format: BinaryFormat) : Serializer() {
override fun fromResponseBody(loader: DeserializationStrategy, body: ResponseBody): T {
val bytes = body.bytes()
return format.decodeFromByteArray(loader, bytes)
}
override fun toRequestBody(contentType: MediaType, saver: SerializationStrategy, value: T): RequestBody {
val bytes = format.encodeToByteArray(saver, value)
return RequestBody.create(contentType, bytes)
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy