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);