I need set serializable interface for using any data class in methods, example data:
@Serializable
interface Todo{}
@Serializable
data class userDataForRegistration(val name: String, val number: String, val password: String): Todo
@Serializable
data class userDataForLogin(val number: String, val password: String): Todo
@Serializable
data class contactForRemove(val id: String, val number: String): Todo
@Serializable
data class userData(val number: String)
@Serializable
data class message(val message: String)
example method, where body - some of the above data classes :
class Connection {
val client = OkHttpClient()
// params: login, registration, contact
fun sendData(url: String, param: String, body: Todo){
var json = Json.encodeToString(body)
var reqBody = RequestBody.create("application/json; charset=utf-8".toMediaTypeOrNull(), json)
val request = Request.Builder()
.url(url)
.post(reqBody)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
println("error" + e)
}
override fun onResponse(call: Call, response: Response){
var res = response.body?.string()
when(param){
"login", "registration" -> {
try{
val objUser = Json.decodeFromString<User>(res.toString())
returnUser(objUser)
}
catch(e: Exception){
val mes = Json.decodeFromString<message>(res.toString())
returnMessage(mes)
}
}
"contact" ->{
val mes = Json.decodeFromString<message>(res.toString())
returnMessage(mes)
}
}
}
})
}
but if i calling method:
val userDataForLogin = userDataForLogin(etv_name.text.toString(), etv_pass.text.toString())
val response = connection.sendData("${ip_static.ip}/user/login", "login", userDataForLogin)
i get error:
@Serializable annotation is ignored because it is impossible to serialize automatically interfaces or enums. Provide serializer manually via e.g. companion object
I need use only TODO interface to use any data class in methods, object and abstract class will doesnt working, because it use data class
Also my plugins in build.gradle:
plugins {
id 'com.android.application' version '7.2.2' apply false
id 'com.android.library' version '7.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.21'
}
I read, that kotlin.plugin.serialization 1.6.2+ working with serialization interface, but idk whats wrong with me... Thank you in advance!)
You should not add @Serializable
to the interface, see the documentation regarding polymorphic seriliazation. Instead you must annotate the implementations and possibly register the corresponding serializers.