2017-06-26 5 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)に基づいて、シリアル化しない場合はtransientと表示されます。

どの参照が循環であるかを知っていて、単にそれらを直列化しないでください。一方、あなたはこの情報を知らないかもしれないので、複雑でない部分から複雑なオブジェクトを構築するいくつかの方法が有益な場合があります。私は複雑なDateオブジェクトをシリアル化しようとしていた場合、単に以下のようなコンストラクタを追加した方がよいかもしれません

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

、その後、あなたはそれを変換、Dateオブジェクトをシリアライズう代わりにdoubleをシリアル化してください。型インターセプタを使用して、型に基づいてこの種の条件付きシリアル化を実行できます。

Java言語の幕開けからシリアライゼーションが問題になりました。残念ながら、オブジェクトをシリアライゼーション機構に貼り付けるだけでは、魔法のように動作することは期待できません。つまり、多くのオブジェクトは、GSONで動作するとなるでしょう。

他のすべてが失敗すると、試行錯誤(あなたが見たように)も機能します。私がGSONのシリアル化/デシリアライゼーションを行っていて、以前にシリアル化していなかったオブジェクトが発生したときは、シリアル化とデシリアライズが期待どおりに動作することを実証コードに入れる前に、 。

+0

私はGSONの初心者ですが、あなたの答えに基づいてどのフィールドが一時的なのか把握していません。 「試行錯誤」は私がやってきたことであり、本当にどこにでも私を導いたわけではありません。 – Dave

+0

フィールドをシリアル化できない場合は、フィールドを一時的にする必要があります。通常、これはデータ値が少ない単純なオブジェクト(セキュリティコンテキストの例など)よりも複雑なものです。 – jwir3

関連する問題