2012-12-05 78 views
4

嗨我正試圖反序列化以下對象。如何反序列化具有參數化構造函數的對象

public class Book extends Item implements Serializable { 
public Boolean isBook; 
public Boolean isBookch; 

private String publicationPlace; 

private String publisher; 

private int edition; 

private String pages; 

private String article; 

Book(String title, String author, String year) 
{ 
super(title, author, year); 
    isBook = false; 
    isBookch = false; 
    publicationPlace = " !!! Not Known !!! "; 
    publisher = " !!! Not Known !!! "; 
    edition = 1; 
    pages = "!!! Not Known !!!"; 
    article = " !!! Not Known !!! "; 
} 

這是對象的結構,我serailizing它....

openw("books.dat"); 
     Date date = new Date(); 
     out.writeObject(date); 
     for(Book b : books) 
      out.writeObject (b); 
     closew(); 

,這是工作非常精細的工作與出任何錯誤。 我試着分散它...

openr("books.dat"); 
     Date lastsaved = (Date)in.readObject(); 
     System.out.println("last saved date : " + lastsaved.toString()); 

     while(true) 
     { 
      Object o = in.readObject(); 
      if(o == null) 
      break; 
      else 
      { 
      addItem((Book)o); 
      books.add((Book)o); 
     } 
     } 
     closer(); 

,這是給錯誤如下:java.io.InvalidClassException:書;沒有有效的構造

如何清除這個問題.. thanx提前...

+0

一個很好的解釋,請 http://stackoverflow.com/questions/7151711/java-why-doesnt-deserialization-invoke-constructor-whats-the-best-workaroun – Rahul

+0

'的readObject()如果你寫了'null',則返回'null':否則。它在文件末尾拋出'EOFException',而不是返回null。當你閱讀一個null時幾乎肯定是不正確和不足的。 – EJP

回答

2

Item必須實現Serializable爲好,

class Item implements Serializable { 

    // ... 

} 

和它的作品!

但是,如果Item不在您的範圍之內,並且沒有非參數構造函數,則不能使Book可序列化。如果發現一個「第一個不可序列化超類的子類 - 可訪問無參數構造函數」(引用ObjectStreamClassgetSerializableConstructor方法的源代碼),則唯一方法是使非序列化類可序列化的子類。在你的情況下,似乎丟失了,所以Book不能被序列化。

在這種情況下,由於您的對象只包含基元,您可以查看JSON作爲序列化對象的替代方法。有JSON庫Java在http://www.json.org

 

NB列表,怎麼可能是Java可以不調用構造函數創建序列化的類的對象? Java的API內部有一個不安全的方法,用於在不調用構造函數的情況下分配對象。真實的故事。

+0

哦k thanx的幫助..但項目類超出我的範圍,不能改變它的代碼..有沒有其他的方式... –

+1

在這種情況下,你搞砸了。我會更新我的答案。 – akuhn

+0

'沒有非參數構造函數的類只有當且僅當它的所有超類都可序列化時纔是可序列化的。'廢話。如果一個類直接或間接地實現了Serializable,並且它的最接近的不可序列化的基類有一個可訪問的無參數構造函數,則它是可序列化的。你的語句中明顯的反例是java.lang.Object,它不是Serializable,它是每個其他類的基類。一個類是否有無參數構造函數對於它是否可序列化沒有任何影響。 – EJP

相關問題