2

Hibernateで取得されたデータベースからオブジェクトをシリアル化しようとしていますが、オブジェクトの実際のデータ全体(サイクルを含む)にのみ関心があります。

今、私はXStreamを使用していますが、これは強力なようです。XStreamの問題は、情報を盲目的に見ていることです。すべてのHibernateメタデータが含まれている状態で、HibernateのPersistentCollectionsをそのまま認識します。それらをシリアル化したくありません。

したがって、PersistentCollection内から元のコレクションを抽出し、オブジェクトが指している可能性のあるすべての参照データを初期化する合理的な方法はありますか。それとも、より良いアプローチを私に勧めてもらえますか?

Simpleの結果は完璧に見えますが、Calendarなどの基本的なutilクラスには対応できません。また、一度に1つの注釈付きオブジェクトのみを受け入れます)

4

3 に答える 3

1

ユーザー dozer: http://dozer.sf.netという、より単純なアプローチをお勧めします。Dozer は Bean マッパーです。たとえば、PersonEJB を同じクラスのオブジェクトに変換するために使用できます。Dozer は、getter() 呼び出しを通じてすべてのプロキシ フェクトを再帰的にトリガーし、src タイプを dest タイプに変換します (たとえば、java.sql.date を java.utilDate に変換します)。

ここにスニペットがあります:

MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance();
PersonEJB serializablePerson = mapper.map(myPersonInstance, PersonEJB.class);

dozer がオブジェクト ツリーをウォークスルーすると、プロキシの読み込みが 1 つずつトリガーされるため、オブジェクト グラフに多くのプロキシがある場合、多くのクエリが表示され、コストがかかる可能性があることに注意してください。

于 2008-10-08T14:06:30.940 に答える
1

ここで説明されているソリューションは私にとってはうまくいきました:http://jira.codehaus.org/browse/XSTR-226

アイデアは、hibernate コレクション用のカスタム XStream コンバーター/マッパーを用意することです。これは、hibernate コレクションから実際のコレクションを抽出し、対応する標準コンバーター (ArrayList、HashMap など) を呼び出します。

于 2009-11-23T16:23:54.083 に答える
0

一般的にそれを行うための最良の方法と思われるものと、現在私が行っている方法は、DTO オブジェクトの別のレイヤーを用意することです。このようにして、チャネルを通過したくないデータを除外したり、グラフがシリアル化される深さを制限したりできます。現在、Hibernate オブジェクトから Flex クライアントへの DTO (Data Transfer Object) に Dozer を使用しています。

いくつかの注意点がありますが、うまく機能します。

  • 速くはありませんが、実際には非常に遅いです。大量のデータを送信すると、Dozer はうまく機能しません。これは主に、その魔法の実行に関係する反射によるものです。
  • 場合によっては、特別な動作のためにカスタム コンバーターを作成する必要があります。これらは非常にうまく機能しますが、双方向です。私は個人的に Dozer のソースをハックして、一方向のカスタム コンバーターを許可する必要がありました。
于 2009-01-11T04:20:39.750 に答える