2012-08-25 13 views
14

Estoy intentando serializar un objeto y luego deserializarlo después de enviar sus datos a un programa cliente.Java - Deserialización InvalidClassException (No es un constructor válido)

Aquí hay un ejemplo de cómo funciona la herencia del objeto. El objeto que estoy serializando y deserializando es persona.

Living -> Animales -> APN -> Persona -> Niño

estar, animal, y el CNP no implementan Serializable. No puedo cambiar esas tres clases. Persona y niño implementan Serializable. Persona y Vida también son clases abstractas. Puedo serializar una Persona (que es un Niño) bien y enviarla, pero cuando intento deserializar a una Persona (que es un Niño), obtengo una InvalidClassException en Child, diciendo "no es un constructor válido".

¿Por qué sucede esto? ¿Deben Living, Animal y NPC implementar Serializable?

+3

probablemente relevante: http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance – leonbloy

Respuesta

13

Buena explicación se hace en respuesta a la pregunta siguiente Deserializing an ArrayList. no valid constructor

Larga historia corta - que necesita sin argumentos constructor de primera clase súper nonserializable de su clase, NPC en su caso.

Si no tiene acceso a NPC y no contiene el constructor no-arg, puede agregar una clase más 'falsa' a la jerarquía, que elegirá la correcta. P.ej.

class SomeClass extends NPC { 
// will be called during deserialization 
public SomeClass(){ 
// call custom constructor of NPC 
super(null); 
} 
} 

class Person extends SomeClass implements Serializable { 
// .. 
} 
+0

¡Eso lo hizo! Gracias. – WildBamaBoy

2

por this thread, que no necesitan implementar Serializable, pero ellos (o en un NPC mínimo, ya que es la primera clase no serializable en la jerarquía) debe contener un constructor 0-parámetro. si no se definen constructores en las clases, el constructor implícito es adecuado, pero si tiene otros constructores definidos en esas clases, debe escribir un constructor de 0 parámetros explícito.

Dado que no puede controlar NPC, intente crear un elemento secundario que defina un constructor de 0-param explícito pero que no implemente Serializable, y vea si eso no lo hace.

0

Me enfrenté al mismo problema con la serialización Hazelcast, pero lo resolvió sin recurrir a una clase intermediaria, mediante el uso de la serialización personalizada. He añadido un vacío constructor sin argumentos a la clase Animal e implementó la clase Persona de la siguiente manera:

class Person extends Animal implements Serializable { 

    private void writeObject(ObjectOutputStream o) throws IOException { 
     o.writeObject(this.fieldA); 
     o.writeObject(this.fieldB); 
     o.writeObject(this.fieldC); 
     ... 
    } 

    private void readObject(ObjectInputStream o) throws IOException, ClassNotFoundException { 
     this.fieldA = (TypeOfA) o.readObject(); 
     this.fieldB = (TypeOfB) o.readObject(); 
     this.fieldC = (TypeOfC) o.readObject(); 
     ... 
    } 
} 
Cuestiones relacionadas