0

Jacksonを使用して、1つのクラスセットを使用する1つのアプリケーションでJSONをシリアル化/逆シリアル化する方法を教えてください。ただし、別のアプリケーションで同じJSONを逆シリアル化し、それらのクラスの異なる実装をロードすることはできますか?

ユーザーがスクリプトでステップを定義できる(Spring MVC)Webアプリケーションがあり、それがクライアントアプリケーションで実行されます。ステップは、のようなものShowDialogStep、のようなプロパティdialogText、またはWaitStepのプロパティを持つ可能性がありdurationます。

クライアントアプリケーションは、サーバーからステップのコレクションをロードします。ただし、クライアントによってインスタンス化されたクラスには、のような実行固有の機能が必要ですexecute()。これは、の場合、WaitStep待機がどれだけ進んでいるかを追跡します。明らかに、サーバー側のアプリケーションはこれを知る必要はありません。簡単な例では、ステップの実行/更新ロジックには、あらゆる種類のクライアント固有の依存関係が含まれます。

したがって、要約すると、次のことが必要です。

  • 'prototype'クラスをJSONにマップするサーバーアプリケーション。
  • 同じJSONを読み取るが、「プロトタイプ」クラスの代わりに実行固有のクラスをインスタンス化するクライアントアプリケーション。

これは、クライアント側のマッパーで構成できるものでしょうか。おそらく、JSONが(完全修飾ではなく)相対クラス名を使用してシリアル化された場合、実行ロジックを使用した実装を別のパッケージで検索するようにデシリアライザーを構成できます。それらの中で?

4

1 に答える 1

3

このアプローチを使用できます。

サーバー側:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
      include=JsonTypeInfo.As.PROPERTY, property="@type")
class Prototype {
...
}

objectMapper.registerSubtypes(
            new NamedType(Prototype.class, "Execution"),
            ...
);

次に、Prototype インスタンスをシリアル化し、Bean のタイプを追加します。

{
  "@type" : "Execution",
  ...
}

クライアント側で:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
      include=JsonTypeInfo.As.PROPERTY, property="@type")
class Execution {
...
}

objectMapper.registerSubtypes(
            new NamedType(Execution.class, "Execution"), // the same name
    ....
);
objectMapper.readValue(....); // will be deserialized to an Execution instance
于 2012-05-03T16:17:54.157 に答える