我正在使用rushorm进行sqlite对象序列化和存储。到目前为止,它的工作非常酷。问题是我不想存储以下Request
对象:
public class Request extends RushObject {
private String url;
private RequestParamsStorable params;
public Request() {}
public Request(String aUrl, RequestParamsStorable aParams)
{
this.url = aUrl;
this.params = aParams;
}
public String getUrl()
{
return this.url;
}
public RequestParams getParams()
{
return this.params;
}
}
如您所见,我需要存储RequestParams对象。为了存储它,因为我显然无法扩展它RushObject
我创建了一个子类并按照文档说明实现了Rush:
public class RequestParamsStorable extends RequestParams implements Rush {
public RequestParamsStorable() {}
@Override
public void save() { RushCore.getInstance().save(this); }
@Override
public void save(RushCallback callback) { RushCore.getInstance().save(this, callback); }
@Override
public void delete() { RushCore.getInstance().delete(this); }
@Override
public void delete(RushCallback callback) { RushCore.getInstance().delete(this, callback); }
@Override
public String getId() { return RushCore.getInstance().getId(this); }
}
它没有抛出任何错误,并且在save()
对象上调用Request
进展顺利。当我要求存储的对象时:
List<Request> remainingsInDB = new RushSearch().find(Request.class);
我确实收到了存储的Request
个对象,其中url
正确,RequestParamsStorable
为空(“”)。我检查过,当我保存它们时,它们定义了值,并且不是空的。
所以问题是我错了吗?
问候,
答案 0 :(得分:1)
如果您的父类 RequestParams 包含声明为最终的字段,则不会恢复它们。
作为参考,您可以看到RushORM源代码
<强> ReflectionClassLoader.java 强>
for (Field field : fields) {
field.setAccessible(true);
if (!annotationCache.get(clazz).getFieldToIgnore().contains(field.getName())) {
if (!loadJoinField(object, rushColumns, annotationCache, field, joins, joinTables)) {
if(rushColumns.supportsField(field)) {
String value = values.get(counter);
if(value != null && !value.equals("null")) {
rushColumns.setField(object, field, value);
}
counter++;
}
}
}
}
您应该删除字段的 final 修饰符或创建将存储在数据库中的包装器对象,然后从中恢复RequestParams
答案 1 :(得分:0)
好的问题确实是RequestParams中声明为final
的字段。 @Stuart Campbell正确地提到RequestParams参考。现在我尝试解决方法是将所有属性(Wrappers除外)存储为JSONObject
,将此JSONObject
存储为String
,然后从中恢复状态。我在JsonWritter
面临一些问题但尚未解决我的问题。不确定在这里发布相关代码或者发布新问题是不是一个好主意?