Pregunta

Tengo un Javaagent adjunto a un proceso remoto utilizando AgentMain que envía objetos Java serializados a través de Socket a una aplicación cliente.

Parece haber un error en el formato de la transmisión que no estoy seguro de si es un error en mi implementación WriteExternal o si tiene algo que ver con las versiones de Java. Estoy experimentando con diferentes combinaciones de Java 1.6 32 /64 bits.

Básicamente, la transmisión del objeto está lanzando una clase no encontrada, pero el nombre del paquete impreso es algo así como org.mycode.beb, la parte Beb no tiene nada que ver con los paquetes que posea y he buscado por todas partes y no hay nada en mi código o bibliotecas con esa cadena ... Beb

Por lo tanto, sospecho que es un problema de codificación causado por una discrepancia de formato de codificación o un problema de longitud de palabras de 32/64 bits, pero no tengo tanta experiencia en estas áreas.

Estoy bastante acostumbrado a abrir el depurador para rastrear los problemas de código, pero el diagnóstico menos experimentado de los problemas de esta naturaleza, con formatos de serialización y byte, por lo que estoy preguntando cuáles son los enfoques recomendados para la depuración.

Tengo control/compilación/fuente del cliente que usa código como:

objectInput = new ObjectInput(inputStream);
Object object = objectInput.readObject(); 

que actualmente lanza la clase no encontrada para el org.mycode.beb

Estaba pensando en reescribirlo para almacenar la transmisión serializada en un archivo y echar un vistazo (no estoy seguro de qué formato el archivo realmente estará en relación con la lectura), ¿es ese el ángulo correcto?

¿Fue útil?

Solución

El formato para ObjectOutputStream no cambia si usa 32 bits o 64 bits o una gran máquina endian o pequeña endian. Donde ha habido problemas en el pasado ha estado entre Java 1.3 y Java 1.4 usando formatos ligeramente diferentes. También Eclipse y Sun usaron diferentes algos para generar SerialVersionUid para que pueda tener problemas si no lo codificó.

Sin embargo, si tiene paquetes como BEB, lo más probable es que haya ofuscado su código, que está diseñado para dificultar el trabajo. Le sugiero que solo depure/monitoree su código no obfusco.

Otros consejos

Además de elogio de @Peter Lawrey.

Creo que para simplificar su depuración debe trabajar con código no obfusco. Esto le dará al menos el consejo donde está el problema.

Además, probablemente el hecho de la ofuscación parcial es la causa raíz de su problema. Piense: su objeto está serializado en el lado del cliente que no está ofuscado. Supongamos que su clase llamada MyFirstClass depende de MySecondClass y se está serializada en consecuencia. Pero en el lado del servidor, el mySecondClass se llama q. ¿Por qué Q? Esto depende del ofuscador. Además, este nombre puede ser diferente para cada construcción. Entonces, el lado del servidor no puede encontrar la clase MySecondClass.

Otro posible problema es SerialiversionUid. Probablemente deba definir esta variable para todas las clases relevantes y manejar su valor.

Pero primero evite la ofuscación e intente nuevamente. Creo que todo funcionará. Buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top