【问题标题】:Android - gson.toJson throws StackOverFlowError on ArrayList<OverlayItem>Android - gson.toJson 在 ArrayList<OverlayItem> 上抛出 StackOverFlowError
【发布时间】:2015-04-28 22:01:06
【问题描述】:

我正在尝试创建一个包含OverlayItemsArrayList 的JSON 字符串(OverlayItem 是我正在使用的一种osmdroid 库)。我这样做的原因是因为我想在关闭 Android 应用程序时保留 ArrayListOverlayItems ,必须保留数据(并且 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


    【解决方案1】:

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

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

    【讨论】:

    • 我明白了。我认为在我的情况下,gson 解决方案不是一个好主意吗?我不喜欢stackoverflow.com/questions/7057845/… 中提到的其他解决方案
    • 嗯,为什么不呢?从技术上讲,您只需要通过定义 InstanceCreator 来做额外的工作。所有文档都可以在那里找到google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/…
    • 我已经用 InstanceCreator 代码更新了我的问题,你知道我做错了什么吗?
    • 所以,我做了一些测试。 OverlayItem 依赖于 Drawable。我建议使用一些简化的对象来存储数据。
    • 我想要存储这些 OverlayItem 的原因是因为它们包含了我想要的所有数据,我需要 Uid、标题、描述和地理点。我想我可以制作对象来保存所有这些数据,然后应该解决 Drawable 依赖
    猜你喜欢
    • 2012-04-29
    • 2017-09-10
    • 2018-07-10
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2013-01-12
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多