2011-06-01 42 views

回答

81

一般來說,當你序列化/反序列化一個對象時,你是這樣做的,以最終的對象狀態爲準;因此,您通常想要規避OO設計中通常需要的封裝。如果你沒有規避封裝,那麼在序列化之前可能無法最終得到反序列化後具有完全相同狀態的對象。此外,請考慮您不想爲特定屬性提供setter的情況。如果你正在通過getter和setter工作,序列化/反序列化應該如何進行?

+21

我們想向外界提供的「計算字段」如何?在你的思考方式中,我應該創建一個字段並每次更新我的POJO字段之一時更新此字段? Urgh ... – 2012-10-16 17:06:05

+1

@Frédéric - 我真的只是指出了通過使用屬性獲取器和setter進行序列化所帶來的困難;計算的屬性也會引入它們自己的問題。例如,如果你給某人一個序列化的對象,那麼他們更新計算出的屬性的值並將其傳回給你,應用程序應該如何處理反序列化?假裝該屬性沒有更新或拋出異常?此外,如果他們更新計算屬性所基於的屬性,則對象狀態實際上是無效的,並且讀取該屬性的值是錯誤的。 – 2012-10-16 18:53:16

+0

我同意@Frédéric;有一些邊緣案例值得使用屬性副域。我剛剛遇到了一個我想要排除的對象上有一個字節數組的地方,而是返回一個String。現在我只剩下通過DTO調整對象了。 – 2012-10-24 00:43:12

22

有沒有辦法讓GSON只使用getter和setter?

還沒有。

the design doc

[T]這裏有很好的理由來支持性能爲好。我們打算在後一版本中增強Gson以支持屬性作爲指示Json字段的替代映射。目前,Gson是以田野爲基礎的。

+0

關於Gson對getter和setter的支持,關於這個來自郵件列表的最新更新是「他在Gson中創建的這個特性的前景相當低。 「https://groups.google.com/forum/#!topic/google-gson/4G6Lv9PghUY – 2011-07-02 09:26:59

+0

我不認爲不應該使用getter和setter,Chris Shaffer在這個答案中解釋了這個很好。 – Sentry 2012-10-09 14:58:59

+43

3年後。任何更新? – 2014-07-17 19:50:08

4

可以將Gson補丁碼爲use getters

+1

我希望能夠指定哪些變量應該使用getter和setter – CQM 2014-05-15 15:15:43

0

我們的應用程序如何工作的模糊概述是我們有很多TypeAdapter實現 - 一些用於特定的值類對象,一些用於bean類型對象,我們知道JavaBean邏輯將工作。然後,我們在創建Gson對象之前將所有這些卡在GsonBuilder上。

不幸的是,GSON在處理類型如Object[]時真的很糟糕。當我們試圖使JSON對象表示方法參數時,我們主要看到了這一點。解決方法是製作反映方法的自定義TypeAdapter實例。 (這意味着你最終會使用一個你打算調用的方法使用一個Gson實例...)

+0

您會如何有效地處理反序列化Object的任何內容?您想如何猜測爲了反序列化它? – 2017-04-10 14:24:50

+0

對於對象,或者對於一般的多態東西,它們可能有一個屬性記錄,該適配器最初將它序列化。但是從記憶來看,我認爲甚至像{「a」,2,「b」}這樣明顯的東西都沒有反序列化爲Object []。 – Trejkaz 2017-04-11 21:13:28

相關問題