改造和orm库抛出StackOverflow

时间:2014-06-03 12:04:26

标签: android orm gson retrofit sugarorm

我尝试使用2个库:

  • square / Retrofit - Rest client
  • 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;
    }
}

但在扩展父类后,改造无法解析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的类父级?

2 个答案:

答案 0 :(得分:3)

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

然而,即使Gson可以应付你的课程,我也不建议使用这些libs组合。

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

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

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

此外,如果您收到服务器的响应,例如

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

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

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

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

答案 1 :(得分:0)

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

你应该把这个构造函数添加到你的Book类中:

public Book(){

}