当使用Realm和Retrofit2将自动管理的RealmObject发送到我们的服务器时,Retrofit2(使用Gson)只发送RealmObject中的int。它完全忽略String和其他字段,并且不将它们放在json中。不会记录任何错误。但是,如果我断开RealmObject与Realm的连接:
realm.copyFromRealm(myRealmObject)
那么它确实发送了所有字段。可能是什么问题?有合适的解决方案吗?
hi3rlvi21#
在我在Stackoverflow上的一篇文章中,我解释了当同时使用Gson和Realm时会发生什么(Retrofit只是将Gson用作数据转换器,所以是Gson失败了,而不是Retrofit)。
...仅发送RealmObject中的整型不!不只是ints...如果你仔细观察,你会发现你的ints也被设置为0(int的null值)。同样的事情也会发生在boolean上,你会在序列化的输出中得到false。实际上,当realmObject是托管的时,所有RealmObject属性都设置为null。(从受管理的realmObject),领域将从持久层读取其值或将其值写入持久层(使用代理),因此您可以确定您正在获取/设置realmObject的正确值(而不仅仅是从内存中获取旧值)。话虽如此,我现在可以解释为什么Gson只对ints进行序列化。
ints
int
null
boolean
false
realmObject
RealmObject
object
char
float
但是,如果我断开RealmObject与Realm的连接...则它会发送所有字段。当您的realmObject是非托管时,它将充当一个普通的java对象(没有使用代理来维护内存中的对象和持久化对象之间的一致性),当然,Gson将不会有问题地序列化它。有没有合适的解决办法?有一些解决方法。在我之前提到的帖子中,我试图收集一些推荐的方法(IMO)来处理这种不兼容性。下面是链接:"Android: Realm + Retrofit 2 + GSON"。
mm9b1k5b2#
您的代码realm.copyFromRealm(myRealmObject)将一个RealmObject更改为一个普通对象(POJO),由文档表示,为一个已持久化的RealmObject创建一个非托管内存中副本(尽管您可以定义depth参数)。对于Retrofit2,现在只支持普通对象,我认为你的代码是绝对正确的,但是GSON读取字段值进行序列化,而托管Realm代理拥有所有null字段(在这里读取)。使用realm.copyFromRealm()将RealmObject更改为普通Java对象,并将其发送到服务器。
depth
Retrofit2
realm.copyFromRealm()
2条答案
按热度按时间hi3rlvi21#
在我们开始之前#
在我在Stackoverflow上的一篇文章中,我解释了当同时使用Gson和Realm时会发生什么(Retrofit只是将Gson用作数据转换器,所以是Gson失败了,而不是Retrofit)。
让我们尽情享受#
...仅发送RealmObject中的整型
不!不只是
ints
...如果你仔细观察,你会发现你的
ints
也被设置为0(int
的null
值)。同样的事情也会发生在boolean
上,你会在序列化的输出中得到false
。实际上,当
realmObject
是托管的时,所有RealmObject
属性都设置为null
。(从受管理的realmObject
),领域将从持久层读取其值或将其值写入持久层(使用代理),因此您可以确定您正在获取/设置realmObject
的正确值(而不仅仅是从内存中获取旧值)。话虽如此,我现在可以解释为什么Gson只对
ints
进行序列化。object
时,它的值将等于null
(一个不指向任何地方的引用),Gson不会麻烦地序列化它(在输出中看不到它)。char
,int
,boolean
,float
...)时,它的值将等于对应于null
的任何值(标量中的每一位都是0),Gson将序列化它,因为它被认为是一个有效值。这解释了“为什么只有你的ints
被序列化”。但是,如果我断开RealmObject与Realm的连接...则它会发送所有字段。
当您的
realmObject
是非托管时,它将充当一个普通的java对象(没有使用代理来维护内存中的对象和持久化对象之间的一致性),当然,Gson将不会有问题地序列化它。有没有合适的解决办法?
有一些解决方法。在我之前提到的帖子中,我试图收集一些推荐的方法(IMO)来处理这种不兼容性。下面是链接:"Android: Realm + Retrofit 2 + GSON"。
mm9b1k5b2#
您的代码
realm.copyFromRealm(myRealmObject)
将一个RealmObject
更改为一个普通对象(POJO),由文档表示,为一个已持久化的RealmObject创建一个非托管内存中副本(尽管您可以定义depth
参数)。对于
Retrofit2
,现在只支持普通对象,我认为你的代码是绝对正确的,但是GSON读取字段值进行序列化,而托管Realm代理拥有所有null
字段(在这里读取)。使用
realm.copyFromRealm()
将RealmObject
更改为普通Java对象,并将其发送到服务器。