gson Kotlin中的枚举注解

pgky5nke  于 2022-11-06  发布在  Kotlin
关注(0)|答案(3)|浏览(170)

我有一个由Gson序列化/反序列化的枚举:

enum class PacketType {
    NONE;
    [SerializedName("request")]
    REQUEST;
    [SerializedName("response")]
    RESPONSE;
    [SerializedName("event")]
    EVENT;
}

不幸的是,我注意到Gson忽略了SerializedName注解,并对枚举值使用大写名称。我决定找出序列化不能按预期工作的原因,并发现Kotlin删除了枚举值的所有注解。我如何才能使这些注解出现在生成的字节码中?

ldfqzlk8

ldfqzlk81#

我看像是有窃听器。请向issue tracker报告。
作为一种临时解决方法,可以使用Java编写此类

ibps3vxo

ibps3vxo2#

这个问题现在已经解决了,你的代码现在可以在KotlinM9(0.9.66)中正常工作。如果你升级到那个版本,它会像你预期的那样工作。
例如:
应用构建器.gradle

dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile 'org.jetbrains.kotlin:kotlin-stdlib:0.9.66'
 compile 'com.google.code.gson:gson:2.3'
}

顶级建筑.gradle

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:0.13.2'
    classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.9.+'
 }
}

我通过创建一个枚举来确认这一点,该枚举在枚举名称和SerializedName名称之间没有关系,并且它按预期工作。

guicsvcw

guicsvcw3#

如果您需要在Retrofit中使用enum作为@Query参数,则可以覆盖toString():

override fun toString(): String {
    try {
        val annotations = javaClass.getField(name).annotations
        for (annotation in annotations) {
            if (annotation is SerializedName) {
                return annotation.value
            }
        }
    } catch (e: NoSuchFieldException) {
        throw RuntimeException(e)
    }
    return super.toString()
}

相关问题