Java Android-gson.toJson在ArrayList上抛出StackOverflower错误<;OverlayItem>;
我正在尝试创建我的Java Android-gson.toJson在ArrayList上抛出StackOverflower错误<;OverlayItem>;,java,android,json,sharedpreferences,gson,Java,Android,Json,Sharedpreferences,Gson,我正在尝试创建我的ArrayList的JSON字符串,其中包含OverlayItem(OverlayItem是我正在使用的一种osmdroid库)。我这样做的原因是因为我想在Android应用程序关闭时保留OverlayItems的ArrayList,数据必须保留(而gson解决方案似乎是实现这一点的好方法,因为你不能只将ArrayList添加到SharedReferences) 这会抛出一个StackOverflowException错误,我认为它无法解析该类型。我查找了我的问题,其他线程上的
ArrayList
的JSON字符串,其中包含OverlayItem
(OverlayItem
是我正在使用的一种osmdroid库)。我这样做的原因是因为我想在Android应用程序关闭时保留OverlayItems的ArrayList
,数据必须保留(而gson解决方案似乎是实现这一点的好方法,因为你不能只将ArrayList
添加到SharedReferences
)
这会抛出一个StackOverflowException
错误,我认为它无法解析该类型。我查找了我的问题,其他线程上的许多答案表明这是由循环引用引起的。我认为情况并非如此,但是对于OverlayItems
,它们是这样构建的:
OverlayItem(String aUid, String aTitle, String aDescription, IGeoPoint aGeoPoint)
IGeoPoint也是osmdroid的一种类型,它只保存经度和纬度int
序列化的代码如下所示:
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>
编辑1
我已经为OverlayItem和IGeoPoint添加了InstanceCreator(它们都没有默认的无参数构造函数):
但我还是犯了同样的错误。我做错了什么?看起来您试图在没有默认构造函数的情况下序列化类(例如,没有构造函数)。如果没有额外的工作,Gson是做不到这一点的(实际上是可以的,但以某种奇怪的方式,这是不安全的)
,这会有帮助。我明白了。我假设gson解决方案在我的情况下不是一个好主意?我不喜欢Hm中提到的其他解决方案,为什么不呢?从技术上讲,您只需要通过定义InstanceCreator来做额外的工作。所有的文档都可以在那里找到我已经用InstanceCreator代码更新了我的问题,你知道我做错了什么吗?所以,我做了一些测试。覆盖项取决于可拉伸。我建议使用一些简化的对象来存储数据。我之所以要存储这些覆盖项,是因为它们包含了我想要的所有数据,我需要Uid、标题、描述和地质点。我想我可以让对象保存所有这些数据,然后应该解决可绘制的依赖关系
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;
}
};
}
}
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);