android - 改造和 orm 库抛出 StackOverflow

标签 android orm gson retrofit sugarorm

我尝试使用 2 个库:

  • square/Retrofit - 休息客户端
  • satyan/sugar - db orm

retrofit 使用gson,类也是如此

public class Book{
    String name;

    public Book(String name) {
        this.name = name;
    }
}

ok,retrofit成功从服务器获取数据并放入我们的Book类。

现在我想保存这些数据。使用orm需要extend父类

    public class Book extends SugarRecord<Book>{
    String name;

    public Book(String name) {
        this.name = name;
    }
}

但是继承父类后retrofit无法解析json。

所以我们得到一个错误:

java.lang.RuntimeException: An error occured while executing doInBackground()
...
Caused by: retrofit.RetrofitError: java.lang.StackOverflowError at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:390)
...
Caused by: java.lang.StackOverflowError at  com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
...

如何交 friend 2 个库,他们使用一个对象类?

或者如何指定改造,使其不触及 Book 的父类?

最佳答案

当 Gson 尝试解析有关它必须反序列化的对象的类型信息时,就会发生错误。由于在 extends 声明中循环引用您的 Book 类,它进入无限递归。

但是,即使 Gson 可以应付您的类(class),我也不建议使用这些库组合。

你看,Gson 所做的与标准 Java 序列化所做的非常相似,只是采用的是 JSON 格式。我的意思是 Gson 获取对象的内部状态并执行其序列化。当它解析 JSON 时,它会创建一个具有此 JSON 中指定状态的对象。

如果您查看 SugarRecord 类,您会看到它有一个名为“tableName”的字段。因此,如果您将 Book 对象传递给 Gson 实例,您将获得

{name: "book name", tableName: "table_book"}.

此外,如果你从服务器得到类似这样的响应

{name: "another book name", tableName: "something absolutely unrelated"},

您将获得 Book 的实例,其状态与此响应中描述的完全匹配。意思是,tableName 不等于您想要的...

您可以使用 exclusion strategies 解决此问题在 Gson 中,但总的来说你会遇到另一个问题。

附言快速浏览后 SugarRecord github 上的类我根本不明白为什么它有一个类型参数。它甚至没有真正使用过。因此,从技术上讲,我认为您可以组合这两个库,如果您跳过 extends 声明中的类型参数,使您的类看起来像 class Book extends SugarRecod { },并且使用exclusion strategy .然而,我自己不会在实践中这样做:)。

关于android - 改造和 orm 库抛出 StackOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24014735/

相关文章:

Android Studio - 错误膨胀类 EditText

Gorm加载相关数据

java - GSON 已弃用。我们可以使用哪一个来序列化 Java 对象和 JSON 之间的反序列化?

java - 使用 Gson pretty-print JSON 字符串的问题

java - ProGuard 混淆、java、Google Gson 和通用集合——如何保留成员?

android 如何在我进行另一项 Activity 时启动主要 Activity

java - 如何让应用重启后服务继续工作

python - 使用 peewee python 支持动态列名称和排序方向的最佳方法

javascript - sequelizejs 关系/关联、hasMany/belongsTo 与定义模型上的引用

javascript - 将 .js 添加到 Cordova 项目会使构建过程崩溃