1

クラスの1つでリストの(逆)シリアル化を変更しようとしています。

リスト内のオブジェクトは、int(それらのjpa id)としてシリアル化され、それに応じて逆シリアル化されます。シリアル化は簡単です。

デシリアライズのために、idとclassがわかっている場合、idをオブジェクトに変換できるクラスがあります。

ジャクソンから必要なクラスを取得するにはどうすればよいですか?すべてのデフォルトのjacksonシリアライザーには、次のようなコンストラクターがあります。protected StdDeserialiser(Class<?> vc)したがって、情報はどこかに存在します。

デシリアライズ中にアクセスする方法はありますか?またはデシリアライザーがジャクソンによって構築される前に?またはHandlerInstantiator内?

特定の参照のデフォルトのdeseriliserを上書きしたいだけなので、プロバイダーやカスタムモジュールを作成することはできません。

4

2 に答える 2

1

ContextDeserializerインターフェイスを使用して、デシリアライザーの内部から機能させました。これにより、デシリアライザーにターゲットプロパティが提供されます。

public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
    Class<?> vc = null;
    if (property.getType().isCollectionLikeType()) {
        vc = property.getType().getContentType().getRawClass();
    } else {
        vc = property.getType().getRawClass();
    }
    return new ResourcePathDeserializer(vc, converter);
}

このソリューションは、戻り型のrawクラスまたはジェネリック(親クラスまたはインターフェイスの可能性があります)のみを取得するため、完全ではありませんが、要件にはそれで十分です。ジャクソンによって解決された「実際の」クラスにアクセスできればもっと良いのですが、私にとってはこれでうまくいきます。

于 2012-09-11T09:49:04.607 に答える
0

まず第一に、モジュールを書くことについては何も派手なことはありません。それは、カスタム(デ)シリアライザーのように、物事をプラグインするための単なる方法です。したがって、それを回避する必要はありません。そして、あなたはあなたが望むことをするためにモジュールを書く必要があることを最も好むでしょう。

一般に、「ユニバーサル」シリアライザーまたはデシリアライザーを作成しようとするのは良い考えではなく、おそらく問題が発生します。しかし、それはあなたが何をしようとしているのかによります。

タイプ情報は次のいずれかになります。

  • コンテキストからの暗黙的:タイプTの(デ)シリアライザーを作成し、それを登録しているので、それがあなたのタイプです
  • インターフェイスを介して(デ)シリアライザーが構築されているときにジャクソンによって渡されます:モジュールは、タイプTの(デ)シリアライザーModuleを持っているかどうかを尋ねられます。SimpleModule); ただし、フルカスタムModuleは着信タイプにアクセスできます。

しかし、上記があなたのユースケースで機能するかどうかはわかりません。タイプ情報は、静的タイプ(リストの宣言されたコンテンツタイプ)から利用できる必要があります。

于 2012-09-07T19:54:09.053 に答える