0

別の VM でオブジェクトを再構築できるように、一時的な属性を使用してオブジェクトをストリーム (またはバイト配列) に書き込みたいと考えています。そのオブジェクトはレガシー アプリケーションの一部であるため、属性を変更したくありません。

標準の Java シリアライゼーション メカニズムは役に立ちません。他にどのようなオプションがありますか?

更新: 私が質問している理由は、既存の Spring アプリケーションを変更したいからです。以前はインプロセスで Bean のメソッドを呼び出していましたが、今度は Bean を別のマシンに移動し、HTTP インボーカーを介して Spring リモート処理を使用したいと考えています。また、このメソッドに渡す必要があるがアプリの他の部分でシリアル化する必要のない一時的なフィールドを持つパラメーターに問題があります。

4

3 に答える 3

3

うーん - 属性が とマークされている場合、transientそれは、オブジェクトの永続的な状態の一部と見なされることを意味するものではないことを正確に意味します (たとえば、シリアライゼーションなど)。これを実行したいという事実はコードの匂いであり、正しい解決策は、これらのフィールドが一時的であることを停止することです。

ただし、何らかの理由でターゲット クラス自体を変更できないとしましょう。readObject()私が最初に考えたのは、 andメソッドを実装することでシリアライゼーションをカスタマイズできるがwriteObject()、それにはターゲット クラスへの変更も必要になるということでした。

その場合、これを行うには、ある種のリフレクション ベースまたはメタデータ ベースの API を使用する必要があります。オブジェクトを XML、JSON、または DB 行などとの間で変換するライブラリは多数あります。これらのいずれかを使用して、オブジェクトを「水和」形式との間で変換することをお勧めします (おそらくカスタマイズする必要があります)。正常なシリアライザーは一時的なフィールドを無視するため)。どちらを選択するかは、現在のソフトウェア スタックと正確な要件によって異なります。

于 2010-06-30T15:21:59.450 に答える
2

レガシーコードを変更できないと思います。この場合、リフレクションDataOutputStreamを使用してオブジェクト フィールドを調べる必要があると思います。

于 2010-06-30T15:18:55.167 に答える
1

transient変数は、シリアル化できないか、簡単に再計算できる変数であると想定されています。

私の最初の提案は、このオブジェクトのメソッドを探してtransientフィールドを再計算することです。

于 2010-06-30T15:18:49.417 に答える