Java 如何比较运行在不同jvm上的两个大型对象';s

Java 如何比较运行在不同jvm上的两个大型对象';s,java,Java,我正在考虑改变一些维护大型网站数据的大型对象的重新加载方式,它们包含与目录结构、产品等相关的数据,并每天重新加载 在更改了它们的重新加载方式后,我需要能够看到结果数据中是否有任何差异,以便重新加载两者并比较内容 可能有一些问题(例如,排序不重要时使用的列表)使比较更加困难,因此我需要能够在比较之前更改结构。我曾尝试使用gson序列化为json,但内存不足。我正在考虑尝试其他序列化方法或编写自己的简单方法 我想这是其他人在更改像这样的关键内容时想要做的事情,但我没有找到任何相关信息。在这种特殊情况

我正在考虑改变一些维护大型网站数据的大型对象的重新加载方式,它们包含与目录结构、产品等相关的数据,并每天重新加载

在更改了它们的重新加载方式后,我需要能够看到结果数据中是否有任何差异,以便重新加载两者并比较内容

可能有一些问题(例如,排序不重要时使用的列表)使比较更加困难,因此我需要能够在比较之前更改结构。我曾尝试使用gson序列化为json,但内存不足。我正在考虑尝试其他序列化方法或编写自己的简单方法

我想这是其他人在更改像这样的关键内容时想要做的事情,但我没有找到任何相关信息。

在这种特殊情况下(单独的虚拟机),我建议在每个类中添加类似于
dump
的方法,将相关内容写入文件(人类可读文本)。此方法还对每个聚合对象调用
dump

最后,您必须从每个VM获取文件,然后您可以使用MD5校验和来比较它们

这可能需要做很多工作,但是如果您遇到任何差异,您可以在这两个文件上使用
diff
,这将是一个很大的帮助

您可以从一个简单的版本开始,通过添加更多的输出逐步完善它

以后向类中添加(完全)序列化很麻烦。可能有一些工具可以简化这一点(使用反射等),但根据我的经验,您必须调整您的类:排除不相关的字段,定义列表的排序顺序,循环关系等


实际上,出于同样的原因,我使用了类似的方法(检查新版本是否仍返回相同的结果):应用程序包含多个服务(对于每个版本),结果始终是数据传输对象,序列化立即添加到DTO,DTO必须提供专门用于此目的的比较方法。

考虑到复杂性和内存问题,正如您提到的,您不想维护版本,我希望使用数据库进行比较。 在将jvm中的数据映射到db表方面需要做一些工作,但一旦完成了这项工作,就可以开始了。您可以从db表中的一个大对象转储数据,然后只需从db中的第二个对象运行检查。
创建存储过程可以简化事情。此解决方案可以支持来自任意数量JVM的数据检查。

为什么不只是对数据进行版本化?i、 e.保留一个单独的文件,其中包含一个版本号,该版本号在每次修改时递增。@gma我需要能够以不同版本之间可比较的方式从对象生成此文件。这意味着它不能有任何任意元数据,比如java序列化输出中的引用。此外,需要在不排序的情况下对集合进行比较I可能是错误的,但这不是他们所说的序列化吗?正如您在最后一段中所说的那样。@Terence有一个区别:序列化覆盖所有数据(就
相等而言)
),但在结果比较的情况下,您通常只对字段的子集感兴趣。例如,主机x上以xxx百万秒为单位执行的元数据是序列化的,但没有进行比较。我主要感兴趣的是,我是否可以在不为所有涉及的类编写自己的序列化的情况下完成这项工作,以及一些通用序列化是否有效,但似乎每个人都在建议同一件事。@MikeB对这个坏消息感到抱歉:-)这是基于我的经验:以后添加泛型序列化往往令人沮丧,添加自制/定制的“部分序列化”是乏味的,但更具有“确定性”。如果您成功地完全序列化(和反序列化!):如果
equals
返回false,则很难发现问题。@berylium Yes,目前看来,这仍然是一个太多的工作——而且因为这是一个回归测试,我不想太多地接触所有这些类。我希望使用数据库进行比较,但前提是有一种通用的方法将对象映射到它(与序列化相同)。我对将其映射到实体表不感兴趣,因为此对象中的数据已经从20多个表加载。