1

あるJAXB注釈付きオブジェクトから別のJAXB注釈付きオブジェクトへのXSLT変換を実行するための次のコードがあります。この場合、パフォーマンスは本当に低下しますか?JAXBオブジェクトをXMLにマーシャリングしますか、それを別のXMLに変換してアンマーシャルしますか、それともここにもっと良いトリックがありますか?

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(mapping.getInputStream()));
JAXBResult result = new JAXBResult(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class));
transformer.transform(new JAXBSource(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class), uploadMessage),result);

return result.getResult();
4

3 に答える 3

2

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

代替アプローチ

JAXBプロバイダーとしてMOXyを使用している場合は、両方のXMLスキーマにマップする単一のJavaモデルを使用できます。標準のJAXB(JSR-222)アノテーションを使用して最初にマップし、MOXyの外部マッピングドキュメントを使用して2番目にマップすることができます。以下は私のブログへのリンクです。このアプローチを使用して、1つのオブジェクトモデルをGoogleとYahooの気象サービスからの出力の両方にマッピングしています。

于 2012-11-28T16:10:24.707 に答える
2

Java 6を使用している場合(私の実稼働経験はOracle JDKに基づいています)、これは私たちも行った有効なアプローチです。パフォーマンスはかなり良いです。マイナーな改善は、テンプレートインスタンスを使用することです。

一方、アプリケーションに1つまたはいくつかの変換があり、変換自体が時間の経過とともに変化しない場合は、このアプローチをお勧めしません。その場合、直接的なアプローチははるかに高速です(Javaインスタンス->Javaマッピング->Javaインスタンス)

于 2012-11-28T14:21:38.903 に答える
2

これはXSLTプロセッサによって異なります。Saxonの商用バージョンは、ストリーミングモードでいくつかの変換を行うことができます。JAXBSource拡張SAXSourceされ、イベントのストリームでも機能します。より複雑な変換または他のXSLTプロセッサを使用する場合、実装はおそらく最初に内部ツリーのような構造を作成します。この構造は通常、DOMツリーよりも最適化されており、パフォーマンスが優れています。いくつかのベンチマークについては、 DOMと他のオブジェクトモデルの比較を参照してください。コードを自分でベンチマークまたはプロファイリングして、パフォーマンスが許容できるかどうかを確認することをお勧めします。

コードに関する1つの注意点として、JAXBContextは作成に費用がかかるため、アプリケーションの存続期間中はキャッシュする必要があります。JaxbUtilsクラスでまだこれを行っていない場合は、コンテキストを再利用するとパフォーマンスが向上する可能性があります。

于 2012-11-28T14:22:26.010 に答える