Java 如何确定以前用JAXB解封的数据已更改?

Java 如何确定以前用JAXB解封的数据已更改?,java,jaxb,marshalling,unmarshalling,Java,Jaxb,Marshalling,Unmarshalling,我只想在用户更改了以前未打包的数据的情况下,使用JAXB将数据打包到一个文件中。我知道JAXB生成的类没有equals()方法。有没有简单的方法来确定数据在解组后是否已更改 例如,org.w3c.dom.Document具有用于此目的的isEqualNode()方法。因此,JAXB不会生成类,它从类的实例封送数据或通过解组xml填充实例。通常,XJC在编译时之前生成类。一个选项是更新类以包含equals方法。这不是一个好主意,因为您通常不想更新生成的代码,以防以后需要重新生成。因此,您可以编写一

我只想在用户更改了以前未打包的数据的情况下,使用JAXB将数据打包到一个文件中。我知道JAXB生成的类没有
equals()
方法。有没有简单的方法来确定数据在解组后是否已更改


例如,
org.w3c.dom.Document
具有用于此目的的
isEqualNode()
方法。

因此,JAXB不会生成类,它从类的实例封送数据或通过解组xml填充实例。通常,XJC在编译时之前生成类。一个选项是更新类以包含equals方法。这不是一个好主意,因为您通常不想更新生成的代码,以防以后需要重新生成。因此,您可以编写一个实用程序类,它获取类的两个实例并对它们进行比较


这是用于解组后的比较。另一种选择是在解组之前通过对文件进行校验和来执行检查。

最好是实现Comparator或实用程序类来检查相等性。
例如,您可以依赖commons lang和。

一个相当标准的方法是向类添加一个
瞬态布尔值
isDirty
,您的setter方法会将其设置为true。(或者,如果愿意,可以添加一个
dateModified

显然,这需要更改可能不合适的内部类代码


您还可以保留已修改的所有对象的一些
集。但是,根据您的代码的组织方式,正确使用此逻辑也可能很棘手或不可能。

您可以使用JAXB2基本插件将equals方法生成到您的模型类中:


我决定封送到org.w3c.dom.Document并使用其isEqualNode()方法。如果原始文档与新文档不同,则我封送到一个文件。因为我没有太多的XML数据,所以它适合我。

isDirty方法的优点是,我不必保留原始数据的副本以供以后比较。但在另一边,我必须找到程序中所有数据可以更改的地方。此外,setter并不总是更改值,它可能会设置以前的值。如果幸运的话,代码对所有内容都使用setter,在这种情况下,添加isDirty很容易。但是,如果不是的话,是的,你必须到处扎根。我喜欢更改字段的名称,或者将它们设置为私有,并让编译器告诉我哪些字段会中断。一般来说,我不会为设置相同的值而过于复杂。除非这种情况经常发生,否则只会导致“一点点”的额外编组。有Eclipse插件吗?我什么也找不到。我懒得处理Maven配置等问题。我无法理解使用EqualBuilder的优势。你必须在你感兴趣的每个类中编写一些代码,不是吗?Eclipse使用“Source->Generate hashCode()和equals()…”不是做得更好吗?您见过ReflectionQuals方法吗?使用Eclipse(该过程很有用,但是如果类发生更改,则必须重新生成hashCode和Equals)。使用reflectionEquals,您不必在添加新字段或删除另一个字段时更改代码。此外,生成hashCode和equals enduce来修改生成的类(这不好,因为每次重新生成代码时都必须这样做)。使用EqualsBuilder.reflectionEquals可以编写实用程序类。