Firebase doTransaction设置数据类值时成员名称出现后缀的原因
Firebase数据类成员带后缀的原因及解决办法
问题原因
- Kotlin UInt类型序列化不兼容:Firebase Realtime Database默认用Gson做序列化,而Gson没有内置支持Kotlin的无符号整数类型
UInt。序列化UInt时,Gson会把它当作复杂对象处理,拆解出内部结构字段,最终在控制台显示出类似-pVg5ArA的后缀(这是Gson对对象内部成员的标识)。 - 缺少自定义序列化配置:如果没给
UInt类型配置专门的序列化规则,Firebase会沿用默认逻辑,导致UInt字段被错误序列化,产生额外后缀。
解决办法
方案一:改用Int类型(推荐)
如果业务场景允许,直接把数据类里的UInt换成Int,Firebase能直接正确序列化数值,避免额外后缀:
data class PokerTableMsg( val turnIndex: Int = 0, val userState: Int = UserState.INVALID.value.toInt(), val minRaise: Int = 0 )
方案二:配置自定义Gson序列化器
若必须保留UInt类型,可自定义Gson的UInt序列化适配器,让Firebase正确处理无符号整数:
// 实现UInt的Gson类型适配器 class UIntTypeAdapter : TypeAdapter<UInt>() { override fun write(out: JsonWriter, value: UInt?) { out.value(value?.toLong()) } override fun read(`in`: JsonReader): UInt { return `in`.nextLong().toUInt() } } // 在Firebase初始化时配置自定义Gson val customGson = GsonBuilder() .registerTypeAdapter(UInt::class.java, UIntTypeAdapter()) .create() // 应用自定义Gson到Firebase Realtime Database Firebase.database.gson = customGson
内容的提问来源于stack exchange,提问作者Guy Sadoun
相关产品推荐
相关产品推荐

