是否可以将 int/long 序列化为 enum? 以前我的模型是这样的:
class A(var style: Int = STYLE_NORMAL) : Parcelable, Observable{...}
样式值可以是其中之一
const val STYLE_NORMAL : Int = 0
或
const val STYLE_CUSTOM : Int = 1
现在我决定用枚举包装它会更好。
enum class Style {
@SerializedName("0") NORMAL,
@SerializedName("1") CUSTOM
}
所以我的模型现在看起来像这样:
class A(var style: Style = Style.NORMAL) : Parcelable, Observable{...}
一切正常,只是 Firebase 无法将先前模型上已存储的对象解析为新模型,而这一行
snapshot.getValue(A::java.class)
抛出异常
E/UncaughtException: com.google.firebase.database.DatabaseException: Expected a String while deserializing to enum class com.stasbar.models.A$Style but got a class java.lang.Long
我知道问题在于 Firebase 只能将字符串解析为枚举。 有什么解决办法吗?
最佳答案
现在我正在使用使用 @IntDef 注释而不是枚举的解决方法。但我将保留枚举解决方案的问题
@Retention(AnnotationRetention.SOURCE)
@IntDef(Style.NORMAL, Style.CUSTOM)
annotation class StyleDef
object Style {
const val NORMAL: Long = 0
const val CUSTOM: Long = 1
}
我的模型变成了
class A(@StyleDef var style: Long = Style.NORMAL) : Parcelable, Observable{...}
关于firebase-realtime-database - Firebase 数据库将 int 序列化为枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46566509/