2010-05-26 15 views
7

Estoy tratando de recoger Java y quería probar con el cliente/servidor de Java para hacer que el cliente envíe un objeto simple de una clase autodefinida (Mensaje) al servidor. El problema era que seguía obteniendo una ClassNotFoundException en el servidor.método readobject arroja ClassNotFoundException

Creo que el resto de los códigos parecen estar bien porque otros objetos como String pueden pasar sin problemas.

Tenía dos proyectos netbeans diferentes en diferentes ubicaciones para el cliente y el servidor cada uno.

Cada uno de ellos tiene su propia copia de clase de mensaje en sus respectivos paquetes. La clase de mensaje implementa Serializable.

En el lado del cliente, intento enviar un objeto Mensaje a través de.

En el lado del servidor, al llamar al método readObject, parece encontrar la clase Message del paquete del cliente en lugar de la suya. printStackTrace mostró: "java.lang.ClassNotFoundException: client.Message" en el lado del servidor

Ni siquiera he tratado de transmitir o almacenar el objeto recibido todavía. ¿Hay algo que dejé?

Respuesta

16

El nombre del paquete y el nombre de clase deben ser exactamente iguales en ambos lados. Es decir. escriba una vez, compile una vez y luego déle a ambas partes la misma copia . No tiene clases server.Message y client.Message separadas, sino una única clase shared.Message o algo así.

Si se puede garantizar el mismo nombre de paquete/clase, pero no siempre siempre que sea exactamente la misma copia, entonces usted necesita para añadir un campo serialVersionUID con el mismo valor a la clase (s) en cuestión.

package shared; 

import java.io.Serializable; 

public class Message implements Serializable { 
    private static final long serialVersionUID = 1L; 

    // ... 
} 
+2

Y por favor, no cometa el serialUID exactamente 1L, ya que esto podría interferir con otro desarrollador que tiene la estúpida la misma idea. – Daniel

+0

¡Funciona ahora! ¡Gracias ~! Finalmente, finalmente entiendo lo que está pasando – eruina

+0

De nada. – BalusC

4

La razón es, que el readObject() en ObjectInputStream está prácticamente implementado como:

String s = readClassName(); 
Class c = Class.forName(s); // Here your code breaks 
Object o = c.newInstance(); 
...populate o... 
Cuestiones relacionadas