代码之家  ›  专栏  ›  技术社区  ›  Hunt

在GSON中序列化泛型类时出现StackOverflow错误

  •  -1
  • Hunt  · 技术社区  · 8 年前

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

    例如,可以为健身类、员工类或联系人类创建请求。下面是检查 我们是否存在任何脱机数据。 getNonSynced 函数将返回 RealmResults 未同步的数据。

    我要补充一点 realmResults 进入请求类 RealmList . 一旦创建了请求,我就使用gson将其转换为json字符串,这就是我的应用程序崩溃和抛出的地方。 Caused by: java.lang.StackOverflowError: 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);
    
    
    
    }
    

    请求类

    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 它可能试图找到具体的类型。我所寻求的是将类装箱并为T提供适当的类类型的方法。

    误差

        07-17 13:04:00.177 6076-6076/com.org.connectedhealth W/System.err: Caused by: java.lang.StackOverflowError: stack size 8MB
            at java.lang.reflect.Field.get(Native Method)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.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$1.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$1.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$1.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);
    

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

     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;
        }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Hunt    8 年前

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

    从

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

    到

    realmList.addAll(realm.copyFromRealm(realmResults));
    
    推荐文章