Kotlin data类映射Firebase带空格字段D8编译报错解决方案
报错根因
Kotlin 支持用反引号包裹不符合常规语法规则的标识符,仅为源码层面的语法糖,不兼容 Android DEX 编译规则:D8 编译为 DEX 字节码时,类成员的简单名称默认不允许包含空格(常规构建目标的 DEX 版本不支持该特性),因此直接声明带空格的成员变量必然触发编译失败,该方案不可行。
可行解决方法
由于你无法修改 Arduino 侧写入 Firebase 的字段名,直接使用 Firebase Realtime Database SDK 自带的字段映射注解即可完成适配,无需修改硬件侧逻辑,也不会触发编译错误:
- 将数据类的字段名修改为符合 JVM 命名规范的合法名称(驼峰、下划线命名均可)
- 为每个字段添加
@PropertyName注解,注解参数填入 Firebase 数据库中实际的带空格键名,SDK 执行序列化/反序列化时会自动按照注解指定的名称匹配数据库字段,不会使用类内的字段名做匹配。
修正后的数据类代码如下:
package com.example.projectxyz.model.user_list import com.google.firebase.database.PropertyName data class DataMeasured( @PropertyName("X Axis") val xAxis: Double = 0.00, @PropertyName("Y Axis") val yAxis: Double = 0.00, @PropertyName("Z Axis") val zAxis: Double = 0.00 )
注意事项
- 该方案同时适配读写场景:如果需要从客户端写数据回 Firebase,SDK 会自动将类内的
xAxis等字段序列化为X Axis格式的键名,和 Arduino 侧的命名规则完全兼容 - 如果构建时开启了 R8/ProGuard 混淆,需要在混淆规则文件中添加对应keep规则,避免类成员被混淆导致序列化失败:
-keep class com.example.projectxyz.model.user_list.DataMeasured { *; }
- 移除之前添加的
@file:Suppress("IllegalIdentifier")注解,该注解仅能抑制IDE的语法提示,无法解决DEX编译层面的限制。
内容的提问来源于stack exchange,提问作者pmjr
相关产品推荐
相关产品推荐

