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

时间:2018-12-15 12:14:38

标签: android json firebase firebase-realtime-database instantiationexception

我尝试像这样从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实例化?

1 个答案:

答案 0 :(得分:1)

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

我的典型方法是具有JSON类型的属性(例如,用于存储时间戳的Long),然后具有getter来返回应用程序所使用的类型(因此{ 1}})。为了确保Firebase不会尝试序列化GregorianCalendar方法,请将其标记为@Exclude(有关此示例,另请参见:How to ignore new fields for an object model with Firebase 1.0.2)。

所以:

GregorianCalendar

这样,Firebase将看到public class EventPojo implements Comparable<EventPojo>{ public Long timestamp @Exclude public GregorianCalendar getDate() { ... } @Exclude public void getDate(GregorianCalendar date) { ... } ... 字段并从中读取并将其写入数据库,而您的代码只是与timestampgetDate()进行交互。