gpt4 book ai didi

使用 Arrays.equals 比较两个 dto 的 java 字节数组

转载 作者:行者123 更新时间:2023-12-01 05:35:23 25 4
gpt4 key购买 nike

我有两个 DTO 需要使用 (Arrays.equals) 进行比较,它们永远不会相等。当我查看每个属性时,两个 DTO 中的数据都是相等的,有时它的长度相等,但 Arrays.equals 返回 false,我尝试使用 Arrays.deepEquals 存在相同的问题,但在某些字段中。我在调试时发现了一些点:

1- 两个 DTO 中的哈希码方法不同。
2- String 类型属性中的问题。

我的问题是如何测试和检测哪些属性不同。

这是我的代码快照:

    Boolean isEqual = false;
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutputStream oStream;

ByteArrayOutputStream bStream2 = new ByteArrayOutputStream();
ObjectOutputStream oStream2;

try {
oStream = new ObjectOutputStream(bStream);
oStream.writeObject(obj1);
byte[] obj1ByteArray = bStream.toByteArray();

oStream2 = new ObjectOutputStream(bStream2);
oStream2.writeObject(obj2);
byte[] obj2ByteArray = bStream2.toByteArray();
System.out.println("Obj1>>" + obj1ByteArray.length);
System.out.println("Obj2>>" + obj2ByteArray.length);
isEqual = Arrays.equals(obj1ByteArray, obj2ByteArray);

oStream.close();
oStream2.close();
<小时/>

数据快照:

    Length
Obj1>>709
Obj2>>709
------------------------------------------------
Object 1
com.beshara.hr.core.interfaces.web.job.shared.structure.dto.JobDTO@1ab5140
59
test_job_5555555
-100
59
1
وظيفة تجريبية 6
وظيفة تجريبية 6أخري
10
10
10.0
وظيفة تجريبية الغرض من الوظيفة 6

--------------------------------
Object 2
com.beshara.hr.core.interfaces.web.job.shared.structure.dto.JobDTO@4cfc52
59
test_job_5555555
0
59
1
وظيفة تجريبية 6
وظيفة تجريبية 6أخري
10
10
10.0
وظيفة تجريبية الغرض من الوظيفة 6

谢谢。

最佳答案

一些评论,但不是解决方案:

  • 与您的问题标题相反,不是 Arrays.equals 是您的问题,而是 ObjectOutputStream 的输出。即使这也可能不是真的 - 这可能是 Unicode 编码问题(见下文)。

  • 请提供short, self contained and correct example 。您的代码丢失了真实的输入数据。这与下一点相加:

  • 大多数 StackOverflow 读者都无法执行西类牙语、法语、德语……脚本中偶尔出现的特殊字符。更不用说完整的阿拉伯语单词了。这会大大减少想要考虑你的问题的人数。

最后解决问题本身:由于 Unicode 允许字符组合的方式,两个不同的 Unicode 字符串可以以相同的方式显示。因此,一般建议是:尽可能将问题归结为问题。

  • 使用 String.equals 比较 DTO 中的每个字符串对。
  • 必须进一步检查返回 false 但以相同方式显示的每一对:使用 NFC 将它们馈送到 java.text.Normailzer code> 和 NFKC 并再次比较结果。
  • 如果现在结果确实可以比较,则说明存在 Unicode 编码问题。写下你的结果,准备一份new exampls并使用新的搜索短语挖掘该网站。

如果此过程无法解决您的问题或缩小您的问题范围,那么仍然可以通过编辑您的问题来提供您的检查结果。

哦,我差点忘了:你说过

I have two DTO need to be compared using ...

您应该考虑一下您真正想要实现的目标,然后决定如何实现这一目标。如果要比较字节,请使用 Arrays.equals。如果您想比较 DTO,则可以通过比较 DTO 中的每个字段来构建您自己的比较方法,并在此处执行任何奇特的“标准化”。 Apache EqualsBuilder 可能是一个可以帮助您的工具。 .

关于使用 Arrays.equals 比较两个 dto 的 java 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8277397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com