RealmObject与Jackson的排除策略

时间:2016-05-03 07:31:39

标签: android jackson gson realm retrofit2

我使用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记录,但这是一个不同的问题) )

0 个答案:

没有答案