我使用retrofit2从API检索数据,并使用Realm在本地缓存它们。我有一个ServiceFactory类,我用它来创建API的所有请求。如果我下载的对象不能扩展RealmObject,它可以完美地工作。要下载(和反序列化)RealmObject,我需要在GsonConverterFactory中包含一个自定义排除策略,如下所示:
Gson gson = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}).create();
retrofit = new Retrofit.Builder()
[...]
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
我试图从Gson转移到Jackson,但我无法找到如何为RealmObject 执行setExclusionStrategy
之类的操作。我知道我可以使用带注释的排除,但这意味着我需要为每个类中的每个属性添加一个注释(超过30个类具有~30属性,这将是疯狂的)
编辑: 我有我的模特 示例扩展了RealmObject { String foo,bar; / 吸气剂 / } 还有一个从api a json下载的服务 { foo:&#39; val1&#39;, 吧:&#39; val2&#39; } 然后我的服务
public interface ExampleService {
@GET("example/{id}")
Observable<Example> getExample(@Path("id") int id);
}
然后我使用new ServiceFactory(getContext()).createRetrofitService(ExampleService.class).getExample(id)[...]
。如果我删除了extends RealmObject
一切正常,但是把它放回去我会得到一个黑屏并在一分钟后崩溃。
为了解决这个问题,我将排除策略如上所述。我还设法绕过杰克逊:
ObjectMapper mapper = new ObjectMapper()
[...]
.setAnnotationIntrospector(new JacksonAnnotationIntrospector(){
@Override
public Boolean isIgnorableType(AnnotatedClass ac) {
if(ac.getRawType().equals(RealmObject.class))
return true;
return super.isIgnorableType(ac);
}
});
retrofit = new Retrofit.Builder()
[...]
.addConverterFactory(JacksonConverterFactory.create(mapper))
.build();
这解决了我的问题,我不知道为什么我会遇到所有这些问题,但现在一切正常(我的执行事件有一些滞后,执行5k记录,但这是一个不同的问题) )