在Android开发中使用Parcelable,Realm和GSON

时间:2017-01-23 14:34:49

标签: java android gson realm parcelable

在Android开发中的一个项目中使用Parcelable,Realm和GSON是否可以?我只是想知道如何同时实现它,因为每个库/框架在制作POJO时都有不同的注释。另一个是Realm和Parcelable都持有数据,所以我需要同时实现它们吗?

2 个答案:

答案 0 :(得分:2)

GSON曾经与Realm有过怪癖,需要以下配置

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();

GSON使用field reflection从对象读取数据,这意味着在托管的RealmObjects上,您的字段将为null值。

这是因为GSON也没有提供使用访问器来获取数据的选项,但Realm代理不会将数据复制到内存中。

如果您需要一个可以使用@Body注释通过Retrofit发送的对象并且是托管的RealmObject,则需要执行apiService.sendObject(realm.copyFromRealm(myObject));

在大多数情况下,Parcelable不需要

RealmObject,因为Realm管理的任何对象都已经保留,并且只要您拥有其主键,就可以在任何地方随时使用。

但是如果你需要制作分离的可修改数据副本并且你一直在努力直接使用类的非托管实例来构建你想要保存的对象,那么你可以轻松地创建Parcelable类使用Parceler库。

简而言之:

  • RealmObjects可以使用Parceler轻松保存到Parcelable,但您通常不需要它,您只需在Activities之间发送主键而不是整个对象
  • GSON对托管对象不起作用,因为GSON is kinda dumb所以你需要先制作内存中的副本

就个人而言,我更喜欢保持我的API响应和我的RealmModels分开,如果您依赖映射到更优化的模式,它会更容易。

答案 1 :(得分:0)

这应该没问题,因为您可以对一个方法或一个类使用多个注释。 如果注释具有相同的名称,则应该为其指定正确的包名称,如@java.lang.Override