2014-02-18 32 views
1

問題加載從SharedPreferences

此問題已被竊聽我相當長的一段時間內存儲的JSON。這不是很常見,但它確實不時發生。問題如下:

我在SharedPreferences的s Gson序列化對象中保存了一堆用戶首選項。這樣, 當我需要對象時,我將它加載到內存中,只做1次調用存儲。然而,對於一些原因的bizzare我得到這個錯誤:

java.lang.RuntimeException: Unable to resume activity {com.a.b/com.a.b.SomeActivity}: java.lang.RuntimeException: unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false} 

。可以看出,json的未加載正確的,這是一個無效的JSON,所以試圖解析它只是拋出一個異常。

一些額外的事實

  • 每一個拋出的異常顯示完全相同的JSON解析問題。出於某種原因,這是總是正在被加載的字符串:

rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}

  • 這不是一個「設備特定問題」,或者至少我是這麼認爲的。證據: enter image description here
    正如您所看到的,它不是特定於某個設備。我也知道一個事實,即它不是特定於Android版本要麼,我們這個墜毀的Android 2.3.64.0.34.1.14.1.2記錄,4.0.4

  • 是序列化的類是

    class AppSettings { 
    
    private boolean tutorialFinished; 
    private boolean googleAuthTutorialFinished; 
    private int appVersion; 
    private int lastOpenedAppId; 
    
    public AppSettings() { 
        tutorialFinished = false; 
        appVersion = NO_STORED_VERSION; 
        googleAuthTutorialFinished = false; 
    } 
    
    public boolean isTutorialFinished() { 
        return tutorialFinished; 
    } 
    
    public void setTutorialFinished(boolean tutorialFinished) { 
        this.tutorialFinished = tutorialFinished; 
    } 
    
    public void setAppVerions(int appVerions) { 
        this.appVersion = appVerions; 
    } 
    
    public void setGoogleAuthTutorialFinished(boolean googleAuthTutorialFinished) { 
        this.googleAuthTutorialFinished = googleAuthTutorialFinished; 
    } 
    
    /** 
    * 
    * @return the stored app version or {@link AppSettingsStorage#NO_STORED_VERSION} if none was found 
    */ 
    public int getAppVerions() { 
        return appVersion; 
    } 
    
    public boolean isGoogleAuthTutorialFinished() { 
        return googleAuthTutorialFinished; 
    } 
    
    public int getLastOpenedAppId() { 
        return lastOpenedAppId; 
    } 
    
    public void setLastOpenedAppId(int lastOpenedAppId) { 
        this.lastOpenedAppId = lastOpenedAppId; 
    } 
    
    } 
    
  • 用於加載JSON方法是:

    private T fromJson(String json) { 
          try { 
           return gson.fromJson(json, type); 
          } catch (Exception e) { 
           throw new RuntimeException("unable to parse type " + type + " with json: " + json); 
          } 
         } 
    

可能的原因:

回答

0

您是否缺少雙引號?

unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: 

rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false} 

應該說是:

unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: 

"rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false} 
+0

我絕不錯過一個雙引號,這正是問題。當Gson序列化AppSetting對象時,應該是有效的json的json字符串被加載爲無效的json。你看到問題了嗎? – fernandohur

+0

對不起。我不同意。你在json中所說的字符串是沒有正確格式化的JSON,就像你在這篇文章中描述的那樣。 – Martin

相關問題