【问题标题】:Generics in Kotlin Serialization produces compile time errorKotlin 序列化中的泛型产生编译时错误
【发布时间】:2021-08-25 01:39:55
【问题描述】:

我在编译同样是泛型的序列化数据类时遇到问题。我对 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
    )
}

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

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

还有一堆关于反射的警告。

我想用泛型和序列化做的事情可能吗?我需要编写自己的反序列化方法吗?

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

【问题讨论】:

    标签: android kotlin serialization


    【解决方案1】:

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

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

    我从序列化存储库中找到了这个comment

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

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

    【讨论】:

    • 感谢您的回复,仔细阅读您发布的指南、cmets 和 git 问题,并将反馈
    • 抱歉拖了这么久,因为墨尔本的强风暴停电了5天。我查看了指南、评论和 git 问题,一直在搞砸,直到几乎放弃。然后我只是复制并粘贴了第一个链接中的代码,它就可以工作了。现在需要了解它的功能,并将其适应我的 GraphQL 示例。非常感谢。
    • 刚刚将 Kapt 添加到我的项目和 Boom 中,不能说我没有收到警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多