You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:36:03