Estoy tratando de validar serializar y deserializar rutinas comparando el objeto resultante con el objeto original. Las rutinas pueden serializar clases arbitrarias y profundamente anidadas y, en consecuencia, quiero una rutina de comparación a la que se le pueda dar la instancia original y final y recorrer reflexivamente cada tipo de valor y comparar los valores y bucear iterativamente en tipos de referencia para comparar valores.profundo de reflexión es igual a comparar
He probado el Apache Commons Lang EqualsBuilder.reflectionEquals(inst1, inst2)
pero esto no parece hacer una comparación muy profunda, que se limita a comparar los tipos de referencia para la igualdad en lugar de buceo más profundo en ellos:
El código siguiente ilustra mi problema. La primera llamada al reflectionEquals
devuelve verdadero pero la segunda devuelve falso.
¿Existe una rutina de biblioteca alguien podría recomendar?
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);
}
Si reflexión es igual se acaba la comparación de referencias, entonces se tiene un error. Debería hacer más que eso. – DwB
@DwB Sospecho que la intención del código es permitirle implementar reflexivamente equals() en una clase específica. Esto es diferente de lo que quiero, que es reflejar en dos instancias de objetos. En este contexto, no es un error, sino una decepción. –
Perdí un medio día de este débil comportamiento indocumentado de EqualsBuilder. Si el campo de un objeto pasado no es primitivo, el builde rjust llama a object.equals(). Muy decepcionante e inútil. – AlexWien