【问题标题】:Realm and Retrofit2: sending auto-managed objectsRealm 和 Retrofit2:发送自动管理的对象
【发布时间】:2017-02-23 14:17:34
【问题描述】:

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

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

realm.copyFromRealm(myRealmObject)

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

【问题讨论】:

    标签: android gson realm retrofit2


    【解决方案1】:

    在我们开始之前

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

    让我们潜入

    ... 只发送 RealmObject 中的整数

    不!不仅仅是ints...

    如果您仔细观察,您会注意到即使您的 ints 也设置为 0(这是 intnull 值)。 boolean 也会发生同样的事情,您会在序列化输出中得到 false

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

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

    • 当您的属性是 object 时,它的值将等于 null(指向无处的引用)并且 Gson 不会费心对其进行序列化(您不会在输出中看到它)。

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

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

    当你的 realmObjectunmanaged 时,它将充当一个普通的 java 对象(不使用代理来维护内存中的对象和持久对象之间的一致性),当然 Gson 会有序列化没问题。

    有合适的解决办法吗?

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

    【讨论】:

    【解决方案2】:

    您的代码 realm.copyFromRealm(myRealmObject)RealmObject 更改为普通对象 (POJO),如文档所述制作已持久化 RealmObject 的非托管内存副本(尽管您可以定义 @987654324 @参数。)

    使用Retrofit2,现在只支持普通对象,我认为你的代码绝对正确,但是GSON读取字段值进行序列化,托管Realm代理具有所有null字段(读取here)。

    使用realm.copyFromRealm()RealmObject 更改为普通Java 对象并将其发送到服务器。

    【讨论】:

    • 感谢@EpicPandaForce
    • 非常感谢......它拯救了我的一天。 realm.copyFromRealm() 成功了
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多