我正在尝试创建一个包含ArrayList
的{{1}}的JSON字符串(OverlayItems
是我正在使用的一种osmdroid库)。我这样做的原因是因为我想在Android应用关闭时保留OverlayItem
ArrayList
,必须保留数据(并且gson-solution似乎是一种很好的实现方式)这是因为您不能只将OverlayItems
添加到ArrayList
)。
这会引发SharedPreferences
错误,我认为无法解析该类型。我查找了我的问题,其他线程上的许多答案表明这是由循环引用引起的。我不认为这是StackOverflowException
的情况,它们是这样构建的:
OverlayItems
IGeoPoint也是一种osmdroid,它只保存经度和纬度。
序列化的代码是:
OverlayItem(String aUid, String aTitle, String aDescription, IGeoPoint aGeoPoint)
为什么我会收到这些错误?:
SharedPreferences.Editor ed = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(waypointMarkers);
ed.putString("waypoints", json);
ed.commit();
// wayPointmarkers is the ArrayList<OverlayItem>
我为OverlayItem和IGeoPoint添加了InstanceCreators(它们都没有默认的no-args构造函数):
java.lang.StackOverflowError
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376)
...
我正在使用此代码注册它们:
class OverlayItemInstanceCreator implements InstanceCreator<OverlayItem> {
public OverlayItem createInstance(Type type) {
return new OverlayItem(null,null,null,null);
}
}
class IGeoPointItemInstanceCreator implements InstanceCreator<IGeoPoint> {
public IGeoPoint createInstance(Type type) {
return new IGeoPoint() {
@Override
public int getLatitudeE6() {
return 0;
}
@Override
public int getLongitudeE6() {
return 0;
}
@Override
public double getLatitude() {
return 0;
}
@Override
public double getLongitude() {
return 0;
}
};
}
}
但我仍然遇到同样的错误。我做错了什么?
答案 0 :(得分:1)
看起来你正在尝试序列化没有默认构造函数的类(例如GeoPoint implementation没有)。如果没有额外的工作,Gson就无法做到(实际上可以,但是以某种古怪的方式并且不安全)。
Check out this thread,它可能会有所帮助。