【发布时间】:2015-04-28 22:01:06
【问题描述】:
我正在尝试创建一个包含OverlayItems 的ArrayList 的JSON 字符串(OverlayItem 是我正在使用的一种osmdroid 库)。我这样做的原因是因为我想在关闭 Android 应用程序时保留 ArrayList 的 OverlayItems ,必须保留数据(并且 gson 解决方案似乎是实现这一目标的好方法,因为你可以'不仅仅是将ArrayList 添加到SharedPreferences)。
这会引发StackOverflowException 错误,我认为它无法解析类型。我查找了我的问题,其他线程上的许多答案表明这是由循环引用引起的。我不认为这是这种情况,但是 OverlayItems 是这样构建的:
OverlayItem(String aUid, String aTitle, String aDescription, IGeoPoint aGeoPoint)
IGeoPoint 也是 osmdroid 的一种,它只是保存了一个经纬度整数。
序列化的代码是这样的:
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>
为什么会出现这些错误?:
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)
...
编辑 1
我已经为 OverlayItem 和 IGeoPoint 添加了 InstanceCreators(它们都没有默认的无参数构造函数):
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;
}
};
}
}
我正在使用以下代码注册它们:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(OverlayItem.class, new OverlayItemInstanceCreator());
gsonBuilder.registerTypeAdapter(IGeoPoint.class, new IGeoPointItemInstanceCreator());
Gson gson = gsonBuilder.create();
String json = gson.toJson(waypointMarkers);
ed.putString("waypoints", json);
但我仍然遇到同样的错误。我做错了什么?
【问题讨论】:
标签: java android json sharedpreferences gson