6

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

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

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

4

3 回答 3

2

对我来说似乎是一个错误。请向问题跟踪器报告。

作为临时解决方法,您可以用 Java 编写此类

于 2014-08-21T10:34:28.867 回答
2

问题现已修复,您的代码现在在 Kotlin M9 (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'
}

顶级 build.gradle

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

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

于 2014-10-29T08:36:25.040 回答
0

如果您需要在 Retrofit 中使用枚举作为 @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()
}
于 2021-06-11T08:23:52.503 回答