2012-03-17 11 views
23

जब मैं कार्यक्रम नीचे चलाने के लिए, मैं के रूप मेंjava.io.InvalidClassException: कोई वैध निर्माता

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) 

अपवाद हो रही है मैंने कहीं पढ़ा है कि जब हम किसी भी बच्चे वर्ग तो क्रमानुसार इसके आधार वर्ग निर्माता निकाल दिया जाता।

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

कृपया सही के रूप में @ हे का जवाब चुनें। – nilskp

उत्तर

28

बस दोनों वर्गों में डिफ़ॉल्ट निर्माता (पैरेंट & बाल)

अक्रमांकन के दौरान प्रदान करते हैं, गैर serializable वर्गों के क्षेत्र सार्वजनिक का उपयोग कर प्रारंभ किया जाएगा या वर्ग के कोई आर्ग निर्माता संरक्षित । एक गैर-तर्क निर्माता को उप-वर्ग के लिए सुलभ होना चाहिए जो धारावाहिक है। Serializable subclasses के क्षेत्र स्ट्रीम से बहाल किया जाएगा। more

+1

क्या मुझे पता चल सकता है कि मुझे क्यों प्रदान करना है। अवधारणा क्या है? – nitdgp

+3

गैर सीरिजिज़ेबल वर्ग के deserilization क्षेत्रों के दौरान डिफ़ॉल्ट कन्स्ट्रक्टर –

+0

का उपयोग करके initilized किया जाएगा 'अंतिम' फ़ील्ड के बारे में क्या होगा? – Tgsmith61591

25

अभिभावक वर्ग के लिए Serializable के कार्यान्वयन जोड़ें।

+2

यह स्कैला में मेरे लिए काम किया। मुझे सिर्फ मूल वर्ग में 'सीरियलज़ेबल' का विस्तार करना पड़ा। –

+3

जावा में भी काम करता है। मुझे यह जवाब बहुत पसंद है, क्योंकि यह अपरिवर्तनीय वस्तुओं के लिए मदद करता है। – Basilevs

+0

स्केल में मैंने जो सिरदर्द किया था, उसके लिए, इस त्रुटि से बचने के लिए उपलब्ध 'सीरियलज़ेबल' और 'java.io.Serializable'' का विस्तार करें :) – spiffman

संबंधित मुद्दे