2012-03-17 19 views
23

Cuando corro debajo programa, yo estoy haciendo una excepción comojava.io.InvalidClassException: ningún constructor válida

java.io.InvalidClassException: Files.SerializationMain; Files.SerializationMain; no valid constructor 
    at java.io.ObjectStreamClass.checkDeserialize(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at Files.SerializationClass.main(SerializationClass.java:71) 
Caused by: java.io.InvalidClassException: Files.SerializationMain; no valid constructor 
    at java.io.ObjectStreamClass.<init>(Unknown Source) 
    at java.io.ObjectStreamClass.lookup(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at Files.SerializationClass.main(SerializationClass.java:61) 

leí en alguna parte que cuando serializarán cualquier clase de niño entonces su constructor de la clase base es despedido.

class Parent123 
{ 
    int age; 
    String name; 

    Parent123(int age,String name) { 
     System.out.println("We are in Parent123 Constructor"); 
     this.age=age; 
     this.name=name; 
    } 
} 

class SerializationMain extends Parent123 implements Serializable { 
    int data1; 
    String data2; 

    SerializationMain(int data1,String data2) 
    { 
     super(20,"test"); 
     this.data1=data1; 
     this.data2=data2; 
    } 

    public void setData1(int data1) 
    { 
     this.data1=data1; 
    } 
    public void setData2(String data2) 
    { 
     this.data2=data2; 
    } 
    public String getData2() 
    { 
     return data2; 
    } 
    public int getData1() 
    { 
     return data1; 
    } 
} 

public class SerializationClass { 

    public static void main(String args[]) 
    { 
     System.out.println("Before Creating Object"); 
     SerializationMain s1=new SerializationMain(10,"Anurag"); 
     try 
     { 
      System.out.println("Serializing Object"); 
      FileOutputStream fis=new FileOutputStream("Test.ser"); 
      ObjectOutputStream ois=new ObjectOutputStream(fis); 
      ois.writeObject(s1); 
     } catch(Exception e1) { 
      e1.printStackTrace(); 
     } 
     try 
     { 
      FileInputStream fis=new FileInputStream("Test.ser"); 
      ObjectInputStream ois=new ObjectInputStream(fis); 
      Object o1=ois.readObject(); 
      SerializationMain s2=(SerializationMain)o1; 
     } 
     catch(Exception e1) 
     { 
      e1.printStackTrace(); 
     } 
    } 
}//End of SerializationClass 
+0

seleccione la respuesta de @hey como la correcta. – nilskp

Respuesta

28

Simplemente proporcione constructor por defecto en ambas clases (Padre & Niño)

Durante la deserialización, los campos de clases no serializables serán inicializadas con el público o protegidos sin argumentos constructor de la clase . Un constructor no arg debe ser accesible para la subclase que es serializable. Los campos de subclases serializables se restaurarán desde la secuencia. more

+1

¿Puedo saber el motivo por el que debo proporcionarlo? ¿Cuál es el concepto? – nitdgp

+3

Durante la deserilización, los campos de la clase no serilizable se iniciarían utilizando el constructor predeterminado –

+0

¿Qué ocurre cuando hay campos 'finales'? – Tgsmith61591

25

Agregue la implementación de Serializable a la clase principal.

+2

Esto funcionó para mí en Scala. Solo tuve que extender 'Serializable' en la clase principal. –

+3

Funciona en Java también. Me gusta esta respuesta mucho más, porque ayuda a los objetos inmutables. – Basilevs

+0

Para cualquiera que se haya topado con el dolor de cabeza que tuve, en Scala, extienda el 'Serializable' disponible y no' java.io.Serializable' para evitar este error :) – spiffman

Cuestiones relacionadas