¿Hay alguna manera de resolver esto?
Básicamente no.
Por lo que se refiere al JLS, los tipos son diferentes y no hay forma de que la JVM le permita pretender lo contrario. Por ejemplo, las clases podrían tener diferentes códigos y diseños de objetos diferentes. Si pudieras engañar a la JVM para que tratara los tipos como iguales, serías capaz de eliminar la seguridad de tiempo de ejecución de JVM. De esa manera yace la locura.
La solución es asegurarse de que no tenga dos cargadores de clases diferentes cargando la misma clase. En el contexto de Tomcat, esto significa que si dos o más aplicaciones web necesitan compartir instancias de una clase, entonces esa clase se debe definir en un cargador de clases que sea común a ambos; p.ej. ponga el archivo JAR en el directorio $CATALINA_HOME/lib
o $CATALINA_HOME/common
.
Si hay una buena razón por qué las clases tienen a ser cargados por diferentes cargadores de clases (tal vez porque las clases son en realidad diferente), entonces se podría solucionar el problema mediante la definición de una interfaz que ambas versiones de la implementar en clase, y luego programar en la interfaz en lugar de la clase de implementación. Por supuesto, solo puede haber una versión de esa interfaz cargada ... o de lo contrario se encuentra con el mismo problema nuevamente.
Creo que la serialización puede funcionar, pero finalmente uso CAS para resolver este problema. :) – xiaolg2008