gpt4 book ai didi

java - 为什么 Firebase 会默默地将我的长整型转换为整数?

转载 作者:行者123 更新时间:2023-12-02 05:24:02 25 4
gpt4 key购买 nike

在某些情况下,我发现 Firebase 的 Java API 存在一些令人惊讶的行为:当我处理 java.lang.Long 时,它返回 java.lang.Integer 的实例。下面是一个 JUnit 测试用例示例:

public class LongsTest extends TestCase {
public void testSetLong() throws Exception {
Firebase firebase = new Firebase("http://www.example.com");
firebase.addChildEventListener(new ChildEventListener() {
@Override public void onChildRemoved(DataSnapshot s) {}
@Override public void onChildMoved(DataSnapshot s, String p) {}
@Override public void onChildChanged(DataSnapshot s, String p) {}
@Override public void onChildAdded(DataSnapshot s, String p) {
Map<String, Object> map = s.getValue(new GenericTypeIndicator<Map<String,Object>>() {});
System.out.println(map.get("key").getClass());
}
@Override public void onCancelled() {}
});
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", new Long(15));
firebase.child("foo").setValue(map);
Thread.sleep(1000);
}
}

运行此代码会打印出class java.lang.Integer! Firebase 显然仍然知道我在其代码中的某处有一个 Long ,因为将 onChildAdded 的主体更改为:

Map<String,Object> map2 = (Map<String,Object>)s.getValue();
System.out.println(map2.get("key").getClass())

正确打印出class java.lang.Long。这是怎么回事?

最佳答案

这里是 Firebase 开发人员。这实际上是一个非常微妙的行为,并且与 Firebase SDK 使用的底层 json 库 (Jackson) 有关。默认情况下,Firebase 在内部将 int 和 long 存储为 long。因此,当您请求返回数据时,默认情况下您将得到一个 Long。

但是,使用 GenericTypeIndicator 会覆盖 Firebase 的默认行为,并在尝试编码到指定类型时直接转到 Jackson 的默认行为。在这种情况下,当 Jackson 遇到一个可以放入 Integer 的数字时,它就会这样做。当它遇到一个太大而无法放入 Integer 的数字时,它返回一个 Long。

作为练习,尝试改变

map.put("key", new Long(15));

map.put("key", (long)Integer.MAX_VALUE + 1)

您应该看到生成的类是 Long。

这样做的基本原理是 GenericTypeIndicator 是一种覆盖 Firebase 默认值的方法。通过使用指定 Object 的 GenericTypeIndicator,您可以将其留给底层反序列化器来选择具体类型。在这种情况下,如果字典中包含所有 Long,则可以执行 Map 。如果没有,可以安全地将遇到的任何整数转换为长整型。不适合整数的值将作为长整型返回。有关 Jackson 的更多信息,您可以在这里找到他们的(确实有点稀疏)文档: http://wiki.fasterxml.com/JacksonDocumentation

关于java - 为什么 Firebase 会默默地将我的长整型转换为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com