2017-02-23 22 views
3

當使用自動發送管理RealmObjects到我們的服務器領域和Retrofit2,Retrofit2(使用GSON)僅發送RealmObject的整數。它完全忽略了字符串和其他字段,並沒有把這些放在json中。沒有錯誤記錄。境界與Retrofit2:發送自動管理對象

如果我然而,從境界斷開RealmObject

realm.copyFromRealm(myRealmObject) 

然後它發送所有領域。可能是什麼問題呢?有沒有合適的解決方案?

回答

2

之前,我們在

潛水在這裏#2我的職位之一,我已經解釋了什麼是使用GSON和境界一起(改造只是使用GSON作爲數據轉換器時發生的,所以它的GSON誰的失敗不改造)。鏈接在下面發佈。

讓我們在

潛水......只發送整數的RealmObject

都能跟得上!不只是ints ...

如果你仔細觀察,你會發現,即使你ints被設置爲0(這是一個intnull值)。同樣的事情將與boolean發生,你會序列化輸出得到false

的事情是,你的所有RealmObject屬性設置爲null,同一個realmObject管理。當您嘗試讀/寫屬性(從管理realmObject),境界會讀/自/至持久層(使用proxies)寫它的價值,所以你是確保你得到/設置該realmObject權值(不只是從內存中獲取舊值)。

話雖這麼說,我現在就可以解釋爲什麼GSON只序列化ints

  • 當你的屬性是object,它的價值將等於null(參考指向無處)和GSON不會打擾其序列(你不會看到它的輸出)。

  • 當你的屬性是定標器類型(charintbooleanfloat ...)將其值等於不管相當於null(每一位在標爲0),並GSON將序列化事業它被認爲是一個有效的價值。這解釋了「爲什麼只有你的ints被序列化」。

如果我然而,從境界斷開RealmObject ...那麼它確實 發送所有領域。

當你的realmObject非託管它會起到一個普通的Java對象(無代理被用來保持在內存中的對象和持久保存的一個之間的一致性),當然GSON的不會有任何麻煩它序列化。

有沒有合適的解決方案?

有解決方法。在我之前提到的文章中,我試圖收集一些推薦的文章(IMO)來解決這種不兼容問題。以下是鏈接:"Android: Realm + Retrofit 2 + GSON"

+1

感謝@AnixPasBesoin –

+0

更多資訊:https://medium.com/@ffvanderlaan/realm-auto-updated-objects-what-you-need-to-know-b2d769d12d76#.yvpvsft1d – Frank

0

您的代碼realm.copyFromRealm(myRealmObject)改變RealmObject正常對象(PO​​JO)表示,通過文件使得已經持續RealmObject非託管內存拷貝(儘管你可以定義depth參數。)

隨着Retrofit2 ,現在只支持普通對象,我覺得你的代碼是完全正確的,但對於GSON系列化讀取字段值,以及管理領域的代理都null字段(讀here)。

使用realm.copyFromRealm()並將其發送到服務器更改RealmObject成普通Java對象。

+0

感謝@EpicPandaForce –