我尝试像这样从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
实例化?
答案 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) {
...
}
...
字段并从中读取并将其写入数据库,而您的代码只是与timestamp
和getDate()
进行交互。