ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-26 07:23:51  阅读:241  来源: 互联网

标签:gson realm retrofit2 android


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

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

realm.copyFromRealm(myRealmObject)

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

解决方法:

在我们深入之前

在我这里关于Stackoverflow的一篇文章中,我解释了一起使用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”.

标签:gson,realm,retrofit2,android
来源: https://codeday.me/bug/20191026/1934826.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有