Kotlin 序列化中的泛型产生编译时错误

Bre*_*ett 6 serialization android kotlin

我在编译也是通用的序列化数据类时遇到问题。我对 Android 和 Kotlin 非常陌生,但我是一位经验丰富的 iOS/Swift 开发人员(不要因此而反对我)。

我正在尝试围绕 GraphQL 响应设置一个通用数据类包装器,它可以返回数据字段中的 T 泛型,或错误字段中的错误。

import kotlinx.serialization.Serializable

@Serializable
data class GraphQLResponse<T:Serializable> (
    val errors : List<ErrorResponse>? = null,
    val data : Map<String, T>? = null
) {
    @Serializable
    data class Location(
        val line: Int? = 0,
        val column: Int? = 0,
        val sourceName: String? = null
    )

    @Serializable
    data class ErrorResponse(
        val locations: List<Location>? = null,
        val errorType: String? = null,
        val message: String? = null
    )
}
Run Code Online (Sandbox Code Playgroud)

编译这个我得到以下错误:

java.lang.AssertionError: Couldn't load KotlinClass from /Users/brett/Development/Company/android/app/build/tmp/kotlin-classes/debug/com/company/company/network/GraphQLResponse.class; it may happen because class doesn't have valid Kotlin annotations
Run Code Online (Sandbox Code Playgroud)

还有一系列关于反射的警告。

我想要通过泛型和序列化来实现的事情是可能的吗?我需要编写自己的反序列化方法吗?

任何帮助和建议将不胜感激。

小智 1

您需要为类型 T 提供自定义序列化器。检查本指南 (顺便说一句,在您的代码中类型 T 不应该是可序列化的 - T:Serializable。这只是注释)

有一个类似的问题,你看看这个。但是,正如您所看到的,如果您在项目中使用 kapt,即使您提供了序列化器,它也可能无法正常工作。

我从序列化存储库中找到了这个评论:

然而,由于提到的 kapt 问题,目前这是不可能的。也许,一个可行的解决方法是将模型和序列化器移动到单独的 Gradle 模块,该模块不由 kapt 处理。

关于这个问题还有更多问题: