2013-06-13 62 views
1
import java.io.*; 

public class SuperNotSerial { 
public static void main(String[] args) { 
    Dog d = new Dog(35, "Fido"); 
    System.out.println("before: " + d.name + " " + d.weight); 
    try { 
     FileOutputStream fs = new FileOutputStream("testSer.ser"); 
     ObjectOutputStream os = new ObjectOutputStream(fs); 
     os.writeObject(d); 
     os.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    try { 
     FileInputStream fis = new FileInputStream("testSer.ser"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     d = (Dog) ois.readObject(); 
     ois.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    System.out.println("after: " + d.name + " " + d.weight); 
} 
} 

class Dog extends Animal implements Serializable { 
String name; 

Dog(int w, String n) { 
    weight = w; // inherited 
    name = n; // not inherited 
} 
} 

class Animal { // not serializable ! 
int weight = 42; 
} 

即將發生的錯誤是。運行時錯誤NoSuchMethodError

此錯誤是編譯錯誤,我無法理解確切原因

Exception in thread "main" java.lang.NoSuchMethodError: Dog.<init>  (ILjava/lang/String;)V 
at SuperNotSerial.main(SuperNotSerial.java:5) 
+0

這對我來說看起來不像編譯器錯誤。 – Patashu

+0

適合我... –

+0

適用於我。我之前得到了這個:Fido 35 之後:Fido 42 – Nargis

回答

1

添加到您缺少序列化需要一個無參數的構造函數FGE答案。

要知道在序列化時需要無參數構造函數,我們需要了解序列化發生的過程。序列化通過鏈接繼承層次中的每個類來工作,然後保存每個超類的狀態,直到達到第一個非序列化類。

現在,當我們嘗試反序列化對象時,無法從流中恢復不可序列化的超類(用於構造對象的確切狀態所需的狀態),而是通過調用無參數的構造函數。

當第一個不可序列化類的no-arg構造函數不可訪問時引發問題,引發異常「InvalidClassException:no valid constructor」。

正如我們所知,每個Java類都有一個無參數構造函數。那麼,它怎麼會有時無法訪問呢?

答案是:只有在類中沒有聲明其他具有參數的構造函數時,纔會調用缺省no-arg構造函數。在這種情況下,爲了調用無參數構造函數,我們需要分別聲明它。

+0

no如果我們不聲明系統創建自身的參數構造函數現在該程序正在運行。 – Monis

+0

@Monis如果您定義_at least_另一個構造函數,則不存在默認的無參數構造函數。 _請確定問題的確切代碼,其中'動物'和'狗'是(相同的文件?不同的文件?)等等。很明顯,你粘貼的代碼不是你跑的錯誤。 – fge

+0

傢伙我認爲這是一些問題,我的日食現在的代碼工作正常..... @fge這是我得到的錯誤相同的代碼 – Monis