以前にアンマーシャリングされたデータがユーザーによって変更された場合にのみ、JAXB を使用してデータをファイルにマーシャリングしたいと考えています。JAXB によって生成されたクラスにはメソッドがないことを知っていますequals()
。アンマーシャリング後にデータが変更されたかどうかを判断する簡単な方法はありますか?
たとえば、この目的のためのメソッドがorg.w3c.dom.Document
あります。isEqualNode()
以前にアンマーシャリングされたデータがユーザーによって変更された場合にのみ、JAXB を使用してデータをファイルにマーシャリングしたいと考えています。JAXB によって生成されたクラスにはメソッドがないことを知っていますequals()
。アンマーシャリング後にデータが変更されたかどうかを判断する簡単な方法はありますか?
たとえば、この目的のためのメソッドがorg.w3c.dom.Document
あります。isEqualNode()
したがって、JAXBは、クラスのインスタンスからデータをマーシャリングしたり、xmlをアンマーシャリングしてインスタンスにデータを入力したりするクラスを生成しません。通常、クラスはコンパイル時の前にXJCによって生成されます。1つのオプションは、equalsメソッドを含むようにクラスを更新することです。後日再生成する必要がある場合に備えて、生成されたコードを更新したくないので、これは良い考えではありません。したがって、クラスの2つのインスタンスを取得し、それらを比較するユーティリティクラスを作成できます。
これは、アンマーシャリング後に比較するためのものです。別のオプションは、ファイルに対してチェックサムを実行することにより、マーシャリングを解除する前にチェックを実行することです。
JAXB2 Basicsプラグインを使用して、モデルクラスにequalsメソッドを生成できます。
org.w3c.dom.Document にマーシャリングし、その isEqualNode() メソッドを使用することにしました。元のドキュメントが新しいドキュメントと異なる場合は、ファイルにマーシャリングします。私はそれほど多くの XML データを持っていないので、うまくいきます。
Comparator またはユーティリティ クラスを実装して等価性をチェックするのがおそらく最善の方法です。たとえば、commons-lang EqualsBuilderおよびCompareToBuilderに依存できます。
かなり標準的なアプローチの 1 つはtransient boolean
、クラスにを追加するisDirty
ことです。セッター メソッドはそれを true に設定します。(または、必要に応じて を追加しますdateModified
)
明らかに、これには不適切な内部クラス コードの変更が必要です。
Set
変更されたすべてのオブジェクトの一部を保持することもできます。ただし、コードの編成方法によっては、このロジックを正しくすることが難しい場合や不可能な場合もあります。