簡體   English   中英

Android-gson.toJson在ArrayList上引發StackOverFlowError <OverlayItem>

[英]Android - gson.toJson throws StackOverFlowError on ArrayList<OverlayItem>

我正在嘗試創建一個包含OverlayItems ArrayList的JSON字符串( OverlayItem是我正在使用的一種osmdroid庫)。 我這樣做的原因是因為我想在關閉Android應用程序時保留這個ArrayList of OverlayItems ,必須保留數據(而gson-solution似乎是實現此目的的一種好方法,因為您不能僅僅添加ArrayListSharedPreferences )。

這引發了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>

為什么會出現這些錯誤?:

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添加了InstanceCreator(它們都沒有默認的無參數構造函數):

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

但是我仍然遇到相同的錯誤。 我究竟做錯了什么?

看起來您正在嘗試在沒有默認構造函數的情況下序列化類(例如, GeoPoint實現沒有一個)。 Gson不能不做額外的工作(實際上可以,但是以某種古怪的方式,這是不安全的)。

查看此線程 ,可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM