在 GSON 中序列化通用 class 时出现 stackoverflow 错误

stackoverflow error while serializing generic class in GSON

我正在尝试构建一个名为 request 的通用对象,它可以保存与不同实体相关的请求。

例如,可以为健身 class、员工 class 或联系人 class 创建请求。现在下面是检查是否的代码 我们有任何离线数据存在与否。 getNonSynced 函数将 return 未同步的数据 RealmResults

我正在将 realmResults 添加到请求 class 的 RealmList 中。创建请求后,我将使用 GSON 将其转换为 json 字符串,这是我的应用程序崩溃并抛出 Caused by: java.lang.WhosebugError: stack size 8MB

的地方

获取离线数据并解析请求的函数

  public <T extends  RealmModel > void checkOfflineData(){


    Realm realm = Realm.getDefaultInstance();

    Set<Class<? extends RealmModel>> realmObjectClasses = realm.getConfiguration().getRealmObjectClasses();

    for(Class modelClass: realmObjectClasses) {

            // fetch non synced data 

            RealmResults realmResults = getNotSynced(realm,modelClass);
            if(realmResults !=null && realmResults.size() > 0){

                //build a request 
                Request<T> request = new Request<T>();
                RealmList<T> realmList = new RealmList<T>();
                //add results to list
                realmList.addAll(realmResults.subList(0, realmResults.size()));
                request.setRequestList(realmList);

            }
    }

    // Parsing using GSON data


    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(Request.class, new RequestSerializer());
    Gson gson = builder.create();
    String data = gson.toJson(request);



}

请求Class

public class Request<T>  {

private RealmList<T> requestList;

public RealmList<T> getRequestList() {
    return requestList;
}

public void setRequestList(RealmList<T> requestList) {
    this.requestList = requestList;
}

}

这可能发生在 GSON 尝试序列化 RealmList<T> requestList 时,它可能试图找到具体类型。我所寻求的只是将 class 装箱并向 T

提供适当的 class 类型的方法

错误

    07-17 13:04:00.177 6076-6076/com.org.connectedhealth W/System.err: Caused by: java.lang.WhosebugError: stack size 8MB
        at java.lang.reflect.Field.get(Native Method)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.writeField(ReflectiveTypeAdapterFactory.java:138)
07-17 13:04:00.178 6076-6076/com.org.connectedhealth W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.write(ReflectiveTypeAdapterFactory.java:127)
07-17 13:04:00.179 6076-6076/com.org.connectedhealth W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.write(ReflectiveTypeAdapterFactory.java:127)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
07-17 13:04:00.180 6076-6076/com.org.connectedhealth W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.write(ReflectiveTypeAdapterFactory.java:127)

我在这里尝试了一些东西,如果我明确提供特定类型的对象,那么 gson 不会抛出错误。

      Request<T> request = new Request<T>();
      RealmList<T> realmList = new RealmList<T>();

      // explicitly providing fitness object 
      realmList.add((T)new Fitness());
      request.setRequestList(realmList);

所以我想我需要探索一种方法来 return 具有特定类型的领域结果。

 private <T extends RealmModel> RealmResults<T> getNotSynced(Realm realm , Class<T> modelClass) {

        RealmResults<T>  realmResults =null;
        try{

            realmResults= realm.where(modelClass).equalTo("syncInfo.syncStatus", false).findAll();
        }catch (Exception e){

            Log.e(TAG ,"Exception "+e.getMessage());

        }

        return  realmResults;
    }

通过替换以下行将领域结果转换为领域列表,它开始工作,因为 realmResults.subList(0, realmResults.size()) returns List<T>copyFromRealm returns List<RealmModel>

来自

realmList.addAll(realmResults.subList(0, realmResults.size()));

realmList.addAll(realm.copyFromRealm(realmResults));