1

私は最近 Genson 1.3 にアップグレードしましたが、以前に 0.98 バージョンにパッチを当てて動作させたので、この問題が新しいものかどうかは 100% わかりません。

環境

BeanMutatorAccessorResolver の独自の実装を使用しています。これは、プロパティをシリアル化するかどうかを動的に決定できるようにするためです。基本的に、Genson を汎用ジャージー REST API インターフェースに統合しました。Genson はすべてのシリアライズとデシリアライズを行います。GET リクエストを実行する場合、ユーザーが特に必要とするフィールドをフィルタリングするために、URL にフィールドを渡すことができます (特に大きなオブジェクトの場合、テーブルの概要を表示するために 3 つのフィールドしか必要ない場合に必要です)。例: ?fields=field1、field2、field3。次に、BeanMutatorAccessorResolver の実装で、シリアル化するフィールドと無視するフィールドを正確に認識します。これは主に、より少ないデータで作業しているため、リクエストと解析を高速化することを目的としています。

問題

残念ながら、Genson がリフレクションなどを介してすべてのフィールドを読み込むと、それがキャッシュされるようです。これは、常に同じフィールドを要求していれば問題ありません。残念ながら、以前よりも多くのフィールドが必要になる場合がありますが、Genson は BeanMutatorAccessorResolver に 2 回アクセスしないため、既にキャッシュされている少数のフィールドのみを返します。

とにかくこのあたりはありますか?おそらく、キャッシュを完全にオフにするよりも優れた解決策があるでしょう。おそらくパフォーマンスが低下するからですよね?

アップデート

これが起こっている場所を見つけたようです。基本的に、Genson は Genson.provideConverter(Type forType) (行: 154) でキャッシュされたコンバーターを返します。

Converter<T> converter = (Converter<T>) converterCache.get(forType);

メソッドの先頭で、__GENSON$DO_NOT_CACHE_CONVERTER を探していることに気付きました。

if (Boolean.TRUE.equals(ThreadLocalHolder.get("__GENSON$DO_NOT_CACHE_CONVERTER", Boolean.class))) {

おそらくこの値を設定する必要がありますか、それともより良い解決策がありますか?

4

1 に答える 1

1

Eugenのおかげで問題は解決しました。解決策はhttps://groups.google.com/forum/#!topic/genson/Z1oFHJfA-5wにあります。

基本的に、これを機能させるには 3 つのクラスを拡張する必要があります。

  1. GensonBuilder に登録できる GensonBundle。
  2. GensonBundle で作成される BaseBeanDescriptorProvider。
  3. BeanDescriptor は BaseBeanDescriptorProvider で作成され、ニーズに適応するための serialize メソッドが含まれています。
于 2015-11-16T23:20:29.030 に答える