我尝试使用2个库:
改造使用 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的类父级?
答案 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(){
}