1

我尝试使用 2 个库:

  • square/Retrofit - 休息客户端
  • satyan/糖 - 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 个他们使用一个对象类的库?

或者如何指定改造,使其不接触书的班级父母?

4

2 回答 2

3

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

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

您会看到,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不等于你想要的……

您可以使用 Gson 中的排除策略来解决此问题,但总体而言,您会遇到另一个问题。

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

于 2014-06-03T13:02:33.820 回答
0

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

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

public Book(){

}
于 2015-10-13T19:01:48.250 回答