Realm 和 Retrofit2:发送自动管理对象

Fra*_*ank 4 android realm gson retrofit2

当使用 Realm 和 Retrofit2 将自动管理的 RealmObject 发送到我们的服务器时,Retrofit2(使用 Gson)仅发送 RealmObject 中的整数。它完全忽略 Strings 和其他字段,并且不会将这些放入 json 中。没有记录任何错误。

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

realm.copyFromRealm(myRealmObject)
Run Code Online (Sandbox Code Playgroud)

然后它确实发送所有字段。可能是什么问题呢?有没有合适的解决办法呢?

Ani*_*oin 5

在我们深入之前

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

让我们深入了解一下

...仅发送 RealmObject 中的整数

没有!不只是ints...

如果仔细观察,您会发现甚至您的值ints也设置为 0(这是null的值int)。同样的事情也会发生在 a 上boolean,你会得到false序列化的输出。

事实上,您的所有属性都管理 时RealmObject设置。当您尝试读取/写入属性(从托管)时,Realm将从/向持久层读取/写入其值(使用代理),因此您确定您正在获取/设置该属性的正确值(而不是只是从内存中获取旧值)。nullrealmObjectrealmObjectrealmObject

话虽这么说,我现在可以解释为什么 Gson 只序列化ints

  • 当你的属性是 an 时object,它的值将等于null(指向任何地方的引用)并且 Gson 不会费心序列化它(你不会在输出中看到它)。

  • 当你的属性是一个缩放器类型(char, int, boolean, float...)时,它的值将等于与 a 对应的任何值null(标量中的每个位都是 0),并且 Gson 会序列化它,因为它被认为是有效值。这解释了“为什么只有你的ints被序列化”。

但是,如果我将 RealmObject 与 Realm 断开连接...那么它会发送所有字段。

当你的realmObject对象不受托管时,它将充当一个普通的 java 对象(不使用代理来维护内存中的对象与持久对象之间的一致性),当然 Gson 序列化它不会遇到任何问题。

有没有合适的解决办法呢?

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

  • 谢谢@AnixPasBesoin (2认同)