【问题标题】:retrofit and orm library throw StackOverflow改造和 orm 库抛出 StackOverflow
【发布时间】:2014-06-03 12:04:26
【问题描述】:

我尝试使用 2 个库:

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

改造使用gson,类也是如此

public class Book{
    String name;

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

好的,改造成功从服务器获取数据并放入我们的 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)
...

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

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

【问题讨论】:

    标签: android orm gson retrofit sugarorm


    【解决方案1】:

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

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

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

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

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

    此外,如果您收到来自服务器的响应,就像

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

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

    您可以在 Gson 中使用 exclusion strategies 解决此问题,但总体而言,您会遇到另一个问题。

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

    【讨论】:

    • 我喜欢改造,为了避免出现问题,我愿意使用另一个 orm 库。但是任何 ORM 都需要继承它们的类。你有什么建议?
    • 好吧,我不是活跃的 ORM 库用户,因此我无法提供建议。但我相信有一个利用注释而不是必须继承某个类。
    • 也许您可以在回调中获取已解析的字段,然后通过为 ORM 设置不同的类将其与糖一起保存?唯一不好的是,数据库插入将发生在 UI 线程上。
    【解决方案2】:

    你的 POJO 类需要一个空的构造函数:

    您应该将此构造函数添加到您的 Book 类中:

    public Book(){
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2020-08-12
      相关资源
      最近更新 更多