Я пытаюсь проверить процедуры сериализации и де-сериализации, сравнивая результирующий объект с исходным объектом. Подпрограммы могут сериализовать произвольные и глубоко вложенные классы, и, следовательно, мне нужна процедура сравнения, которая может быть предоставлена исходному и окончательному экземпляру и рефлексивно пройти через каждый тип значения и сравнить значения и итеративно погрузиться в ссылочные типы для сравнения значений.Глубокое отражающее сравнение равно
Я попытался Apache Commons Lang EqualsBuilder.reflectionEquals(inst1, inst2)
, но это не кажется, делают очень глубокое сравнение, оно просто сравнивает ссылочные типы равенства, а не погружаться глубже и глубже в них:
Следующий код иллюстрирует мой вопрос. Первый вызов reflectionEquals
возвращает true, а второй возвращает false.
Есть ли библиотека, которую каждый может порекомендовать?
class dummy {
dummy2 nestedClass;
}
class dummy2 {
int intVal;
}
@Test
public void testRefEqu() {
dummy inst1 = new dummy();
inst1.nestedClass = new dummy2();
inst1.nestedClass.intVal = 2;
dummy inst2 = new dummy();
inst2.nestedClass = new dummy2();
inst2.nestedClass.intVal = 2;
boolean isEqual = EqualsBuilder.reflectionEquals(inst1.nestedClass, inst2.nestedClass);
isEqual = EqualsBuilder.reflectionEquals(inst1, inst2);
}
Если отражение равно просто сравнению ссылок, то у него есть ошибка. Он должен сделать больше, чем это. – DwB
@ DwB Я подозреваю, что цель кода - позволить вам рефлексивно реализовать equals() в определенном классе. Это отличается от того, что я хочу, чтобы отразить два экземпляра объекта. В этом контексте это не ошибка, а скорее разочарование! –
Я потерял половину дня, этого слабого недокументированного поведения EqualsBuilder. Если поле переданного объекта является не примитивным, то builde rjust вызывает object.equals(). Очень разочаровывает и бесполезно. – AlexWien