Android - gson.toJson在ArrayList上抛出StackOverFlowError <overlayitem> </overlayitem>

时间:2015-02-26 13:36:31

标签: java android json sharedpreferences gson

我正在尝试创建一个包含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>

编辑1

我为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;
            }
        };
    }
}

但我仍然遇到同样的错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

看起来你正在尝试序列化没有默认构造函数的类(例如GeoPoint implementation没有)。如果没有额外的工作,Gson就无法做到(实际上可以,但是以某种古怪的方式并且不安全)。

Check out this thread,它可能会有所帮助。