领域和Retrofit2:发送自动管理的对象

当使用Realm和Retrofit2将自动管理的RealmObject发送到我们的服务器时,Retrofit2(使用Gson)仅发送RealmObject中的int.它完全忽略了Strings和其他字段,并且没有将它们放在json中.没有错误记录.

但是,如果我将RealmObject与Realm断开连接:

realm.copyFromRealm(myRealmObject)

然后它会发送所有字段.可能是什么问题呢?有适当的解决方案吗?

解决方法:

在我们深入之前

在我这里关于*的一篇文章中,我解释了一起使用Gson和Realm时发生了什么(Retrofit只是将Gson用作数据转换器,因此Gson失败了而不是Retrofit).链接在下面发布.

让我们潜入

… only sends the ints in the RealmObject

不!不只是整数…

如果仔细观察,您会注意到,即使您的int也被设置为0(这是int的空值).布尔值会发生同样的事情,在序列化输出中您将得到false.

事实是,当管理相同的realmObject时,所有RealmObject属性都设置为null.当您尝试从托管的realmObject读取/写入属性时,Realm将从持久层读取/写入持久性层(使用proxies)的值,因此您确定要获取/设置该RealmObject的正确值(不仅仅是从内存中获取旧值).

话虽如此,我现在可以解释为什么Gson只序列化int.

>当您的属性是一个对象时,其值将等于null(指向无处的引用),并且Gson不会费心对其进行序列化(您不会在输出中看到它).
>当您的属性是定标器类型(char,int,boolean,float …)时,其值将等于对应于null的任何值(标量中的每个位均为0),并且Gson将对其进行序列化,因为它被认为是有效值.这解释了“为什么只有您的int被序列化”.

If I however, disconnect the RealmObject from Realm … then it does
send all fields.

当您的realmObject不受管理时,它将充当一个普通的Java对象(不使用代理来维护内存中的对象与持久对象之间的一致性),而且Gson当然可以轻松地对其进行序列化.

Is there a proper solution?

有解决方法.在我前面提到的帖子中,我尝试收集一些推荐的(IMO)来解决这种不兼容的问题.这是链接:“Android: Realm + Retrofit 2 + GSON”.

上一篇:java-如何使用新值对对象进行JSON编码?


下一篇:java-gson-反序列化包含列表的对象