2016-09-23 75 views
1

我得到一個StackOverflow錯誤任何時候我嘗試Serialize一個JSON StringPOJO Object具有兩個ConstructorsGSON StackOverflow的錯誤的Android

public class ObjectClass extends BaseObservable implements Serializable { 

    @Inject Realm realm; 
    private String TAG = "ObjectClass"; 

    private String name; 
    private String address; 

    public ObjectClass() { 
    } 

    public ObjectClass(Context context) { 
     ((MainApplication) context.getApplicationContext()).getMainAppComponent().inject(this); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setname(String name) { 
     this.name = name; 
    } 

    @Bindable 
    public String getAddress() { 
     return address; 
    } 

    public void setaddress(String address) { 
     this.address = address; 
     Realmaddress result = realm.where(Realmaddress.class).equalTo("id", address).findFirst(); 
     if (result != null) 
      Log.e(TAG, result.toString()); 
    } 
} 

我應該刪除這個構造

public ObjectClass(Context context) { 
    ((MainApplication) context.getApplicationContext()).getMainAppComponent().inject(this); 
} 

一切工作正常。但是,如果我離開它,我會遇到StackOverFlow錯誤。

String testJson = "{\n" + 
       "\t\"name\" : \"Test Name\",\n" + 
       "\t\"address\" : \"Test Address\"\n" + 
       "}" 

Gson gson = new GsonBuilder().setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'").setPrettyPrinting().create(); 
    ObjectClass objectClass = gson.fromJson(testJson, ObjectClass.class); 

一切都只是掛起,一段時間後,我收到了StackOverflow錯誤

編輯1

所以,深調試完畢後。我注意到構造函數不是問題。這是@Inject Realm realm;所以,我試圖做到這一點@Expose(deserialize = false, serialize = false) @Inject Realm realm;這也沒有解決它。

EDIT 2

我編輯我GSON Exclusion Strategy到這個樣子。但是,進入後也不會解決它,如果塊和日誌,它與您使用dependency injection存在

public class CustomGsonParser { 

    public static Gson returnCustomParser(){ 
     return new GsonBuilder() 
       .setExclusionStrategies(new ExclusionStrategy() { 
        @Override 
        public boolean shouldSkipField(FieldAttributes f) { 
         if (f.getAnnotation(Inject.class) != null || 
           f.getDeclaringClass().equals(RealmObject.class) || 
           f.getDeclaringClass().equals(Realm.class)) { 
          Log.e("GSONBuild", "Exists Inject"); 
          return true; 
         } 
         return false; 
        } 

        @Override 
        public boolean shouldSkipClass(Class<?> clazz) { 
         if (clazz.equals(Inject.class)) 
          return true; 
         return false; 
        } 
       }) 
       .create(); 
    } 
} 

回答

0

所以,我注意到Realm實際上是主要原因。我仍然不知道爲什麼。所以,我所做的是通過了上下文,並沒有dependency injectModel了。我使用上下文創建一個Realm實例。所以,我的Object Class現在看起來像這樣

public class ObjectClass extends BaseObservable implements Serializable { 

    private String TAG = "ObjectClass"; 

    private String name; 
    private String address; 
    @Expose(deserialize = false, serialize = false) 
    private Context context; 

    public ObjectClass() { 
    } 

    public ObjectClass(Context context) { 
     this.context = context; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setname(String name) { 
     this.name = name; 
    } 

    @Bindable 
    public String getAddress() { 
     return address; 
    } 

    public void setaddress(String address) { 
     this.address = address; 
     Realmaddress result = RealmUtils.getInstance(context).where(Realmaddress.class).equalTo("id", address).findFirst(); 
     if (result != null) 
      Log.e(TAG, result.toString()); 
    } 
} 
0

有東西在下面未得到serialised正確線和它變得無限serialisation所以你得到stackoverflow錯誤,因爲你的記憶在一段時間內耗盡。

((MainApplication) context.getApplicationContext()).getMainAppComponent().inject(this); 

要麼刪除上面的句子,如果它在代碼中不可用或以其他方式執行。

+0

嗯,它正在使用。你是什​​麼意思?我需要'realm',因爲Object正被'databinder'使用。我可以讓'Gson'省略而不關心它嗎? –

+0

@ItuokeAjanlekoko otherway從這個意義上說,您可以使用接口在這種情況下傳遞/發送您的數據 – Nikhil