为什么Firebase存储时使用getter名而非私有字段名_n?
问题解答
根本原因
Firebase Realtime Database 安卓 SDK 对 Java 对象做序列化时,遵循 JavaBean 命名规范通过反射读取 Getter 方法推导存储键名,不会直接读取私有字段的名称。
具体规则说明
- SDK 会遍历类中所有 public、无参、方法名以
get(布尔类型对应is前缀)开头的方法 - 截取方法名中
get/is之后的部分作为键名:- 你的方法是
get_UserName(),截取后得到_UserName,这就是你看到的存储键名 - 当你把方法重命名为
get_UserNameBlaBla3563636(),截取后得到的键名自然就变成了_UserNameBlaBla3563636,和你测试的结果完全匹配
- 你的方法是
- 私有字段因为不可直接访问,默认不会被 SDK 读取名称作为键,只有 public 修饰的字段才会被 SDK 直接用字段名作为键
为什么本地存储键名是_n
你使用的安卓本地存储工具的序列化逻辑和 Firebase 不同,它是直接反射读取类的私有字段名称,所以会拿到_n作为键名。
解决方案
如果你要强制让 Firebase 存储时用_n作为键,只需要在 Getter、Setter 方法上加上 Firebase 的PropertyName注解即可:
import com.google.firebase.database.PropertyName; public class UserModel { private String _n; // 其他构造方法、逻辑代码... @PropertyName("_n") public String get_UserName() { return _n; } @PropertyName("_n") public void set_UserName(String _n) { this._n = _n; } }
注:你提供的写入代码里存在笔误,
productMap.put($newUserID, productNew);应该是userMap.put($newUserID, newUser);,这个笔误不影响本次问题的核心逻辑。
内容的提问来源于stack exchange,提问作者Java NewUser
相关产品推荐
相关产品推荐

