2015-08-29 61 views
1

我想把一個對象放入一個文件,然後嘗試使用Externalizable接口讀取同一個對象,並且我得到一個Exception Car類的無效構造函數。在java中的外部化

import java.io.*; 
class Base 
{ 
    int a; 
} 
class Car extends Base implements Externalizable 
{ 
    static int b; 
    String c=""; 

    Car(int d,int e,String f) 
    { 
     a=d; 
     b=e; 
     c=f; 
    } 
    Car() 
{super();} 
     public void writeExternal(ObjectOutput oos) 
     { 
      try 
      { 
      oos.writeInt(a); 
      oos.writeInt(b); 
      oos.writeObject(c); 
      } 
      catch(Exception e){} 
     } 
     public void readExternal(ObjectInput ois) 
     { 
      try 
      { 
      a=ois.readInt(); 
      b=ois.readInt(); 
      c=(String)ois.readObject(); 
      } 
      catch(Exception e){} 
     } 
    } 
    class Main 
    { 
      public static void main(String args[])throws Exception 
     { 
      Car c1=new Car(1,2,"Manish"); 
      FileOutputStream fos=new FileOutputStream("man.txt"); 
      ObjectOutputStream oos=new ObjectOutputStream(fos); 
      oos.writeObject(c1); 
      FileInputStream fis=new FileInputStream("man.txt"); 
      ObjectInputStream ois=new ObjectInputStream(fis); 
      Object o=ois.readObject(); 
      Car c2=(Car)o; 
      System.out.println(c2.a+" "+c2.b+" "+c2.c); 
     } 
    } 

有人可以解釋什麼是錯誤?

+0

爲什麼不實現可序列化?但要回答你的問題,你需要一個調用超級構造函數的公共默認構造函數。 public Car(){super();} – user

+0

因爲我正在學習Externalzable。 –

回答

1

Java序列化假定您有一個公共的默認構造函數。

有些庫不做這個假設,但內置序列化。

順便說一句,除非你確定這樣做是安全的,否則你不應該忽略異常。在你的情況下,你不需要抓住它們。

public void writeExternal(ObjectOutput oos) throws IOException { 
    oos.writeInt(a); 
    oos.writeInt(b); 
    oos.writeObject(c); 
} 
+0

但那不是解決方案。我得到例外,你能解釋爲什麼我得到它,我怎麼能刪除它。例外是在這一行Object o = ois.readObject(); –

+1

@ManishKumar''Java序列化假定你有一個公共的默認構造函數。「'=>你必須有一個公共構造函數。將'public'添加到您的默認構造函數和您的類中。這在'readObject()'上失敗,因爲它是這個方法,它檢測到它不能調用你的默認構造函數,因爲它不是公共的。 –

1

主要問題是一個簡單的事實:Externalization接口通過對象本身工作來提供序列化。

這意味着對象本身有責任保存和恢復其狀態,這意味着對象必須能夠反序列化其內部的狀態(通過readExternal)。

發生了什麼情況是序列化引擎分配一個對象的空實例,然後調用readExternal

所以基本上什麼情況是這樣的:

Car emptyCar = Car.class.newInstance(); 
emptyCar.readExternal(state); 

由於這從一個Car不同的包發生駐留和Car()default知名度,發動機無法調用默認的構造函數,因此,錯誤。

您必須提供一個public默認構造函數。

+0

Thanx bro。這真的很有幫助。 –