2017-06-26 50 views
0

我使用的是Gson 2.8.1。我有這個代碼當我試圖使用Gson的toJson方法時,如何確定標記爲瞬態的字段?

 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) 

每其他的答案,如果我標記導致此作爲循環引用「短暫的」,這理應走了,但我怎麼計算出來的程序?我查看了所討論的對象,並且通過代碼檢查循環引用是什麼對我來說並不明顯。

回答

0

根據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序列化/反序列化時,遇到一個以前沒有序列化過的對象時,我首先會爲它編寫一個單元測試,以確保序列化和反序列化按照我期望的方式工作,然後將其放入生產代碼中。

+0

也許是因爲我是GSON的新手,但我不會根據您的答案找出哪些字段是暫時的。 「試錯」是我一直在做的事情,它並沒有真正引導我到任何地方。 – Dave

+0

如果字段無法序列化,則該字段必須是暫時的。通常,這比具有少量數據值的簡單對象(例如安全上下文的示例)更復雜。 – jwir3

相關問題