gson 领域和改造2:发送自动管理的对象

eit6fx6z  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(150)

当使用Realm和Retrofit2将自动管理的RealmObject发送到我们的服务器时,Retrofit2(使用Gson)只发送RealmObject中的int。它完全忽略String和其他字段,并且不将它们放在json中。不会记录任何错误。
但是,如果我断开RealmObject与Realm的连接:

realm.copyFromRealm(myRealmObject)

那么它确实发送了所有字段。可能是什么问题?有合适的解决方案吗?

hi3rlvi2

hi3rlvi21#

在我们开始之前#

在我在Stackoverflow上的一篇文章中,我解释了当同时使用Gson和Realm时会发生什么(Retrofit只是将Gson用作数据转换器,所以是Gson失败了,而不是Retrofit)。

让我们尽情享受#

...仅发送RealmObject中的整型
不!不只是ints...
如果你仔细观察,你会发现你的ints也被设置为0(intnull值)。同样的事情也会发生在boolean上,你会在序列化的输出中得到false
实际上,当realmObject托管的时,所有RealmObject属性都设置为null。(从受管理的realmObject),领域将从持久层读取其值或将其值写入持久层(使用代理),因此您可以确定您正在获取/设置realmObject的正确值(而不仅仅是从内存中获取旧值)。
话虽如此,我现在可以解释为什么Gson只对ints进行序列化。

  • 当属性是object时,它的值将等于null(一个不指向任何地方的引用),Gson不会麻烦地序列化它(在输出中看不到它)。
  • 当你的属性是一个标量类型(charintbooleanfloat...)时,它的值将等于对应于null的任何值(标量中的每一位都是0),Gson将序列化它,因为它被认为是一个有效值。这解释了“为什么只有你的ints被序列化”。

但是,如果我断开RealmObject与Realm的连接...则它会发送所有字段。
当您的realmObject非托管时,它将充当一个普通的java对象(没有使用代理来维护内存中的对象和持久化对象之间的一致性),当然,Gson将不会有问题地序列化它。
有没有合适的解决办法?
有一些解决方法。在我之前提到的帖子中,我试图收集一些推荐的方法(IMO)来处理这种不兼容性。下面是链接:"Android: Realm + Retrofit 2 + GSON"

mm9b1k5b

mm9b1k5b2#

您的代码realm.copyFromRealm(myRealmObject)将一个RealmObject更改为一个普通对象(POJO),由文档表示,为一个已持久化的RealmObject创建一个非托管内存中副本(尽管您可以定义depth参数)。
对于Retrofit2,现在只支持普通对象,我认为你的代码是绝对正确的,但是GSON读取字段值进行序列化,而托管Realm代理拥有所有null字段(在这里读取)。
使用realm.copyFromRealm()RealmObject更改为普通Java对象,并将其发送到服务器。

相关问题