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’)。”