firebase:InstantiationException:无法实例化抽象 class java.util.TimeZone

firebase: InstantiationException: Can't instantiate abstract class java.util.TimeZone

我尝试从这样的 firebase 数据库中解析 EventPojo-类 的列表:

GenericTypeIndicator<HashMap<String, EventPojo>> tEvents = new GenericTypeIndicator<HashMap<String, EventPojo>>() {};
HashMap<String, EventPojo> events = dataSnapshot.child(getString(R.string.eventsNodeName)).getValue(tEvents);

EventPojo 我有一个 GregorianCalender:

public class EventPojo implements Comparable<EventPojo>{

    GregorianCalendar date;
...

当我尝试从数据库获取 HashMap 时,我得到一个 InstantiationException:

java.lang.RuntimeException: java.lang.InstantiationException: Can't instantiate abstract class java.util.TimeZone

为什么 firebase 试图实例化 TimeZone 而不是 GregorianCalender

Firebase 实时数据库仅存储 JSON 类型。如果不编写自定义代码,就无法 serialize/deserialize a GregorianCalendar(或 TimeZone)。

我的典型做法是有一个JSON类型的属性(例如,一个Long来存储时间戳),然后有一个getter returns 应用程序使用的类型(因此在您的情况下为 GregorianCalendar)。为确保 Firebase 不会尝试序列化 GregorianCalendar 方法,请将其标记为 @Exclude (also see: How to ignore new fields for an object model with Firebase 1.0.2 以获取一些示例)。

所以:

public class EventPojo implements Comparable<EventPojo>{
    public Long timestamp

    @Exclude
    public GregorianCalendar getDate() {
      ...
    }
    @Exclude
    public void getDate(GregorianCalendar date) {
      ...
    }

    ...

有了这个,Firebase 将看到 timestamp 字段并从中读取它并将其写入数据库,而您的代码只与 getDate()setDate().[=21 交互=]