2012-03-12 13 views
6

私はGSONシリアライズPOJOを使用します。変更前と変更後の両方のオブジェクトです。Gsonを使用してPOJOをシリアライズ

Struts2によって設定された変更されたもの(Aと呼ぶ)は、Jsonに簡単にシリアル化できます。

変更前のPOJOはデータベースからiBatis経由で取得(Bと呼ぶ)できませんでしたが、シリアル化できませんでした。

エラーメッセージ:「タイプアダプタの登録を忘れましたか?

私はGson APIを読んでいます。しかし、私はすべてのPOJO用のタイプアダプタを登録するのは良い考えではないと思います.Bは何がシリアル化できないのですか?

私はPOJOのためにクローン()を書いており、Bからクローン化されたオブジェクトもやっています。

これは混乱しています...誰かが私に答えることはできますか? (Bのクローン)、変更された前

は:

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","name":"testetes","gender":"男","phone":"553223","city":"未选择","ocup":"未选择","nation":"未选择","famStru":"未选择","infSouc":"未选择","creater":"EE4783A6272A4B62A5CC68DB3C11FE1E","createDate":"Feb 29, 2012 12:00:00 AM","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","nextDate":"Mar 7, 2012 12:00:00 AM","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Feb 29, 2012 12:00:00 AM","lastModifier":"EE4783A6272A4B62A5CC68DB3C11FE1E","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向","status":"0"} 

変更された(A)の後:あなたのPOJOの型がお客様であるよう

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","visitMode":"","name":"testetes","gender":"男","telPhone":"","phone":"553223","fax":"","adrs":"","postCode":"","email":"","workUnit":"","city":"未选择","media_id":"","ocup":"未选择","idNum":"","nation":"未选择","famStru":"未选择","infSouc":"未选择","createDate":"Feb 29, 2012 12:00:00 AM","idAdr":"","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","customerDetail":"","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Mar 11, 2012 2:58:04 PM","lastModifier":"00000000000000000000000000000000","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向"} 
+0

2つのJSON文字列と両方の場合の出力を投稿してください。 –

+0

両方のJSON文字列が有効です。遭遇したエラーメッセージとライブラリは何ですか? –

+0

最初の文字列はB'cloneからシリアル化されます。 **エラーメッセージ:_java.lang.UnsupportedOperationException:java.lang.Class:com.b5.customer.domain.Customerを直列化しようとしました。エラーが発生しました。エラーは発生しません。POJO Bをシリアル化しようとするとエラーが発生します。 。タイプアダプターの登録を忘れましたか?_ –

答えて

10

ですね?オブジェクトをクローンすると、新しいCustomerを作成しています.Gsonはそれをただちにシリアル化できます。ただし、DBから同じオブジェクトをフェッチするときは、標準のCustomerオブジェクトではありません。代わりに、オブジェクトのクラスなど、いくつかの持続情報を含むサブクラスです。

おそらく最も簡単な解決策は、Gsonの@Expose注釈を使用することです。 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()でGsonオブジェクトを作成する場合は、@Exposeを使用してシリアル化するCustomerフィールドをそれぞれマークすることができます。永続化フレームワークのサブクラスのフィールドを含む他のフィールドは、シリアル化されません。

+0

優れた答え! – Medo

2

ブランドンが正しくありました。注釈を使用したり、POJOクラスを変更したりしたくない場合は、別の解決方法があります。これは他の人にも役立つかもしれません。

Type typeOfSrc = new TypeToken<A>() {}.getType(); //this helps for generic one. 
gson.toJson(obj, typeOfSrc); or gson.toJson(obj, A.class); 
関連する問題