我尝试使用 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/