2012-08-06 41 views
0

我只想將JAXB中的數據編組爲一個文件,如果以前解組數據已被用戶更改。我知道由JAXB生成的類沒有equals()方法。是否有任何簡單的方法來確定數據在解組後是否已經改變?如何確定先前用JAXB解組的數據已更改?

E.g. org.w3c.dom.Document爲此具有isEqualNode()方法。

回答

0

我已經決定編組爲一個org.w3c.dom.Document中並使用它的isEqualNode()方法。如果原始文檔與新文檔不同,那麼我將編組爲一個文件。由於我沒有太多的XML數據,它對我很有用。

0

因此,JAXB不生成類,它從類的實例封送數據或通過解組xml填充實例。通常這些類是在XJC編譯之前生成的。一種選擇是更新類以包含等於方法。這不是一個好主意,因爲您通常不希望更新生成的代碼,以免日後需要重新生成。所以你可以編寫一個實用類,它需要兩個類的實例並對它們進行比較。

這是用於比較反編組後。另一種選擇是在對文件進行校驗和解編之前執行檢查。

0

最好的可能是實現比較器或實用程序類來檢查相等性。 你可以例如依靠commons-lang EqualsBuilderCompareToBuilder

+0

我無法理解使用EqualsBuilder的優點。你必須在你感興趣的每個類中編寫一些代碼,不是嗎?不是Eclipse用「Source - >生成hashCode()和equals()...」做得更好嗎? – ka3ak 2012-08-07 06:58:47

+0

你見過reflectionEquals方法嗎?使用Eclipse(該過程非常有用,但如果您對類進​​行更改,則必須重新生成hashCode和Equals)。使用reflectionEquals,當您添加新字段或刪除另一個字段時,您不必更改代碼。 – YMomb 2012-08-07 12:07:31

+0

此外,生成hashCode並等於enduce修改生成的類(這不好,因爲每次重新生成代碼時都必須這樣做)。使用EqualsBuilder.reflectionEquals可以讓你編寫一個實用程序類。 – YMomb 2012-08-07 12:09:27

0

一個相當標準的方法是將transient boolean添加到類isDirty,並且您的setter方法將其設置爲true。 (或者,如果您願意,可以添加dateModified

顯然,這需要更改您的內部類代碼,這可能不合適。

您還可以保留一些Set的所有已修改的對象。但是根據代碼的組織方式,獲取這個邏輯正確也可能是棘手或不可能的。

+0

「isDirty」的好處是,我不需要保留原始數據的副本以供日後比較。但在另一方面,我必須找到數據可以改變的程序中的所有地方。另外,setter並不總是改變這個值,它可能會設置以前的值。 – ka3ak 2012-08-07 05:00:30

+0

如果你很幸運,代碼使用setter來表示一切,在這種情況下很容易添加isDirty。但是,如果沒有,是的,你必須根深蒂固。我喜歡改變這些字段的名稱,或者讓它們變成私有的,並讓編譯器告訴我什麼是中斷。總的來說,我不會爲了設置相同的價值而超級複雜。除非這種情況發生很多,否則只會導致額外編組的「一點點」。 – user949300 2012-08-07 16:34:21