2012-08-22 32 views
3

這我如何反序列化我的ArrayList中包含的識別反序列化ArrayList。沒有有效的構造

public void deserializeArrayList(){ 
    String path = "./qbank/IdentificationHARD.quiz"; 
    try{ 
      FileInputStream fileIn = new FileInputStream(path); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      ArrayList<Identification> list = (ArrayList<Identification>) in.readObject(); 
      System.out.println(list); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

對象這是我如何序列化

public void saveItemIdentification(ArrayList<Identification> identification,File file){ 
    try{ 
     ObjectOutputStream out = new ObjectOutputStream(
             new FileOutputStream(file)); 
     out.writeObject(identification); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

但是,當我反序列化它,它給了我這個錯誤

java.io.InvalidClassException: quizmaker.management.Identification; quizmaker.management.Identification; 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 java.util.ArrayList.readObject(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at quizmaker.management.Manage.deserializeArrayList(Manage.java:92) 

This is line 92

ArrayList<Identification> list = (ArrayList<Identification>) in.readObject(); 

這是怎麼發生的?

這是Identification對象的代碼。

package quizmaker.management; 
import java.io.Serializable; 
import quizmaker.Accounts.Rights.IAnswerable; 

public class Identification extends Question implements Serializable{ 

    private static final long serialVersionUID = 2L; 
    private String question; 
    private String answer; 

    public Identification(String q , String a){ 
     super(q,a); 
    } 

    public String toString(){ 
     return String.format("Question: %s\n Answer %s", getQuestion(),getAnswer()); 
    } 
} 
+0

那你'Identification'對象? – npinti

+0

你可以把你的識別類的一些代碼 –

+0

@SumitSingh我更新了它,請檢查 – user962206

回答

9

的問題是 - > Java中

Java serialization process only continues in object hierarchy till the class 
is Serializable i.e. implements Serializable interface in Java. 

而在你的類,你在呼喚super類構造函數未實現Serializable。

所以這就是問題.. :)

關於第二個問題就來看看JavaDoc

During deserialization, the fields of non-serializable classes will be 
initialized using the public or protected no-arg constructor of the class. 
A no-arg constructor must be accessible to the subclass that is serializable. 
The fields of serializable subclasses will be restored from the stream. 
+0

也我需要一個空的構造函數?序列化? – user962206

+0

對此,您可以查看鏈接瞭解更多詳細信息。 –

+0

您是從哪裏找到的? 「Java序列化過程只能在對象層次結構中繼續進行,直到類 是Serializable即使用Java實現Serializable接口。」? – user962206

相關問題