1

私はCastorとデータバインディング全般に不慣れです。私は、部分的にソケットからデータを取り出し、POJO を作成するためにデータを非整列化する必要があるアプリケーションに取り組んでいます。これで、ソケットの作業が完了し、Ant と Castor のおかげで Java ファイルを生成してコンパイルすることさえできました。

ここに問題があります。受信するデータ ストリームは、約 9 つの異なるオブジェクトのいずれかである可能性があります。つまり、操作対象のオブジェクトを表すテキスト (XML) のストリームを受け取ります。繰り返しますが、オブジェクトの種類によって異なります。オブジェクトが 1 つだけの場合は、簡単です。非整列化コマンドを呼び出して、気ままに進んでください。しかし、それは多くの種類のオブジェクトの 1 つである可能性があるため、何をアンマーシャリングすればよいでしょうか? マッピングについて調べましたが、理解できなかったか、動的マッピングではなく静的マッピングのようです。

そこに何か助けはありますか?

4

3 に答える 3

2

そうです、Castor は静的マッピングを期待しています。しかし、あなたはそれで働くことができます。着信 xml を変更するコードを記述して、お客様側では Castor が 1 つのスキーマを使用できるようにし、クライアント側ではスキーマを変更する必要がないようにすることができます。

Castor が取得することを期待するスキーマを、共通のルート要素を持つものに変更します。その下には、さまざまなオブジェクトの 9 つの異なる代替があります (スキーマが 9 つのうちの 1 つだけを許可するように制限できると思います。すべてのサブ要素をオプションにするだけでうまくいくことはありません)。

次に、受信 xml を変更して受信 xml をその共通のルート要素でラップするコードを記述し、ラップされた xml をストリームにフィードして、Castor unmarshaller が読み取ります。

xml ラッピング部分を実装するには、少なくとも 3 つの異なる方法があります: SAX、XSLT、および XML ライブラリ (JDOM、DOM4J、および XOM など - 私は XOM を好みますが、どれも機能します)。

すでに SAX に精通している場合、または他の方法のいずれかが機能したがパフォーマンスが不足している場合は、おそらく SAX の方法が最適です。それを実装する必要がある場合は、xml を取り込んで xml を出力する XMLFilter を作成し、xml を OutputStream に書き込む別の部分の上にそれをスタックし、アンマーシャリングの周りにラッパー メソッドを記述して、受信ストリームをフィードします。 xmlreader を使用して、OutputStream を別の InputStream にコピーし (簡単な方法は commons-io を使用することです)、新しい InputStream を Castor unmarshaller にフィードします。

XSLT を使用すると、SAX にだまされることはありません。XSLT は時々苦労するという評判がありますが、これは比較的簡単な変換のように思えますが、私も試していません。何にでも XSLT を使用するのは久しぶりです。私はそれを手に負えませんが、パフォーマンスについても確信が持てません。

XOM、JDOM、または DOM4J を使用して XML をラップすることも可能で、学習曲線は SAX や XSLT の場合よりもはるかに低くなります。欠点は、XML ドキュメント全体が一度にメモリに吸い込まれる傾向があるため、非常に大きなドキュメントを処理すると、メモリが不足する可能性があることです。

于 2009-11-24T14:37:37.423 に答える
1

すべての着信メッセージ オブジェクトが、メッセージ タイプを示すフィールドを持つ基本インターフェイスを実装する Jibx にも同様のものがあります。

text/xml は基本インターフェースにシリアライズされ、コマンド パターンを使用して、基本インターフェースで定義されているメッセージ タイプに応じて、それぞれのビジネス ロジックを呼び出します。

これがキャスターを使用して可能かどうかはわかりませんが、パフォーマンスが素晴らしいので、Jibx を見てください。

http://jibx.sourceforge.net/

于 2009-11-25T12:45:49.763 に答える
0

あなたの洞察に感謝します。お二人は、私が持っていなかったいくつかの良い情報と新しい知識を私に与えてくれました. 結局、ハックを介してプロセスを機能させることができました。テキスト ストリームを取得し、メッセージのルート タグを解析してから、それをオンにして、作成する正しいオブジェクトを決定します。私は自分のすべてのオブジェクトを個別にアンマーシャリングしており、誰もが満足しています。

于 2009-12-10T20:40:04.090 に答える