gpt4 book ai didi

java - 如何在 Android 中使用 firebase 9.2 的自动值

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:03:21 27 4
gpt4 key购买 nike

我想使用 auto-valuefirebase 9.2.0+ .我有以下代码:

@AutoValue
public abstract class Office {

public static Builder builder() {
return new AutoValue_Office.Builder();
}

public abstract double latitud();
public abstract double longitud();

@AutoValue.Builder
public static abstract class Builder {

public abstract Builder latitud(double latitud);
public abstract Builder longitud(double longitud);

public abstract Office build();

}

}

但是当我调用这个 Office office = childDataSnapshot.getValue(Office.class); 时,我收到了这个错误:

com.google.firebase.database.DatabaseException: No properties to serialize found on class com.example.app.model.Office

有人知道为什么我会收到此错误以及如何解决吗?我读到 firebase 不再使用 jackson 进行 json 序列化。所以我不确定如何指定一种 @JsonProperty("latitud") 我使用 @PropertyName 失败了。

我还尝试重命名抽象方法,如 public abstract double getLatitud(); 之后,错误是下一个:

java.lang.InstantiationException: Can't instantiate abstract class com.example.app.model.Office

所以我不确定如何解决这个问题。

解决方案

感谢 hatboysamFrank van Puffelen 我终于可以用下一个解决方案来面对这个问题了。

  1. 我创建了一个 FirebaseUtil enum基于 hatboysam 回答和 Frank van Puffelen 评论,使用两种方法为 Firebase 序列化和反序列化对象。
  2. 我创建了几个 UserPhone 类用于测试。
  3. 依赖关系:

    compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.0'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.8.0'
  4. 使用示例:

    User user = FirebaseUtil.deserialize(dataSnapshot, User.class);
    Map<String, Object> map = FirebaseUtil.serialize(user);

最佳答案

我不确定默认的 Firebase 数据映射器是否可行,但有一个可能的解决方法。首先让我们解释一下您看到的错误:

com.google.firebase.database.DatabaseException: No properties to serialize found on class com.example.app.model.Office

Firebase 映射器查找 public 字段或以 getFoo/setFoo 模式命名的字段。因此,在您的类中,映射器看不到任何属性。

java.lang.InstantiationException: Can't instantiate abstract class com.example.app.model.Office

我认为这是您出行时遇到的麻烦。为了使反序列化工作,您的类需要有一个公共(public)的、无参数的构造函数,映射器可以通过反射调用它 (newInstance())。据我所知,这不是 AutoValue 的工作方式。

但不要失去希望!。根据this github issue有一种方法可以使用 @JsonCreator 注释使 Jackson 和 AutoValue 兼容。因此,您需要同时使用 Jackson 和 Firebase 来完成这里的工作。

序列化:

// Convert to a Map<String,Object> using Jackson and then pass that to Firebase
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.convertValue(office, Map.class);
databaseReference.setValue(map);

反序列化:

// Use Firebase to convert to a Map<String,Object>
GenericTypeIndicator<Map<String,Object>> t = new GenericTypeIndicator<Map<String,Object>>() {};
Map<String,Object> map = dataSnap.getValue(t);

// Use Jackson to convert from a Map to an Office object
ObjectMapper mapper = new ObjectMapper();
Office pojo = mapper.convertValue(map, Office.class);

关于java - 如何在 Android 中使用 firebase 9.2 的自动值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38261396/

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