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

Posted

技术标签:

【中文标题】firebase:InstantiationException:无法实例化抽象类 java.util.TimeZone【英文标题】:firebase: InstantiationException: Can't instantiate abstract class java.util.TimeZone 【发布时间】:2019-05-16 11:08:08 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

我的典型方法是拥有一个 JSON 类型的属性(例如,一个 Long 来存储时间戳),然后有一个 getter 来返回应用程序使用的类型(所以 GregorianCalendar 在你的情况)。为确保 Firebase 不会尝试序列化 GregorianCalendar 方法,请将其标记为 @Exclude(另请参阅: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() 交互。

【讨论】:

以上是关于firebase:InstantiationException:无法实例化抽象类 java.util.TimeZone的主要内容,如果未能解决你的问题,请参考以下文章

无法解决:com.google.firebase:firebase-ml-vision:24.1.3;无法解决:com.google.firebase:firebase-core:20.0.2

没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”

Firebase 持久化,清除 Firebase 缓存

Firebase 存储不会下载并添加到 firebase 数据库

将 Firebase 身份验证与 Firebase 数据库连接