簡體   English   中英

嘗試使用Gson的toJson方法時,如何確定將哪些字段標記為瞬態?

[英]How do I figure out what fields to mark as transient when tryhing to use Gson's toJson method?

我正在使用Gson 2.8.1。 我有這個代碼

        Object o = session.getSecurityContext();
        Gson gson = new Gson();
        String serialized = gson.toJson(o);

這將導致此堆棧溢出錯誤。

15:45:47,784 ERROR [io.undertow.request] (default task-58) UT005023: Exception handling request to /ebook/WEB-INF/views/registration/studentConfirm.jsp: java.lang.StackOverflowError
    at sun.util.locale.provider.DateFormatSymbolsProviderImpl.getInstance(DateFormatSymbolsProviderImpl.java:85)
    at java.text.DateFormatSymbols.getProviderInstance(DateFormatSymbols.java:359)
    at java.text.DateFormatSymbols.getInstance(DateFormatSymbols.java:335)
    at java.util.Calendar.getDisplayName(Calendar.java:2110)
    at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1125)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
    at java.text.DateFormat.format(DateFormat.java:345)
    at com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:83)
    at com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:41)
    at com.google.gson.internal.bind.TypeAdapters$26$1.write(TypeAdapters.java:586)
    at com.google.gson.internal.bind.TypeAdapters$26$1.write(TypeAdapters.java:579)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976)

在其他答案中,如果我將引起這種情況的循環引用標記為“瞬態”,則據說該引用將消失,但是我如何以編程方式解決這一問題呢? 我已經看過有問題的對象,通過代碼檢查什么是循環引用對我來說並不明顯。

根據《 GSON用戶指南》( https://sites.google.com/site/gson/gson-user-guide ),在不應序列化字段時將其標記為臨時字段。

理想情況下,您將事先知道哪些引用是循環的,並且只需避免序列化它們即可。 另一方面,您可能不知道此信息,因此使用某種方式從不太復雜的部分構造復雜對象有時是有益的。

例如,如果我要序列化一個復雜的Date對象,則最好像下面這樣添加一個構造函數:

public Date(double ms) {
  // create new Date from milliseconds from the epoch
}

然后,在要序列化Date對象的位置,將其轉​​換為毫秒,然后對double序列化。 您可以使用類型攔截器根據類型執行這種條件序列化。

自Java語言問世以來,序列化一直是一個問題。 不幸的是,您不能簡單地將任何對象粘貼到序列化機制中並期望它會神奇地工作。 就是說,只要您將它們分解,許多對象可以與GSON一起使用。

當所有其他方法都失敗時,反復試驗(就像您剛剛看到的)也可以工作。 當我使用GSON序列化/反序列化時,遇到一個我之前從未序列化過的對象,我首先為其編寫一個單元測試,以確保序列化和反序列化能夠按我期望的方式工作,然后再將其放入生產代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM