2012-05-06 34 views
0
的子類時

我試圖序列Path2D.Double,序列化工程的一個子類,但反序列化確實是因爲以下異常的不是:「沒有有效的構造」序列化Path2D.Double

Exception in thread "main" java.io.InvalidClassException: CustomShape; no valid constructor 
at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:147) 
at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:755) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at CustomShape.main(CustomShape.java:38) 

難道這是由於超類Path2D沒有實現Serializable?但是,Path2D.Double本身也不能被反序列化。

這裏是我的代碼:

import java.awt.geom.Path2D; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class CustomShape extends Path2D.Double { 
    private static final long serialVersionUID = 1L; 

    public CustomShape() { 
     super(); 
    } 

    public static void main(String[] args) throws Exception { 
     //Make Shape 
     //Path2D shape = new Path2D.Double(); //works 
     Path2D shape = new CustomShape(); //doesn't work 
     shape.moveTo(0, 0); 
     shape.lineTo(0, 10); 
     shape.lineTo(10, 10); 
     shape.lineTo(10, 0); 
     shape.closePath(); 

     File file = new File(System.getProperty("user.dir"), "shape"); 
     //Save Shape 
     if (!file.exists()) { 
      file.createNewFile(); 
     } 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); 
     out.writeObject(shape); 
     out.flush(); 
     out.close(); 

     //Load Shape 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); 
     Object obj = in.readObject(); 
     in.close(); 

     System.out.println(obj); 
    } 
} 
+0

顯示Path2D及其內部類Double的聲明。 –

+0

@Marko Topolnik他們是jre類。 'java.awt.geom.Path2D'具有'private''readObject'和'writeObject'的實現。它似乎處理包私人'瞬態double [] doubleChords' – esej

+0

對不起,沒有看到進口。我正在查看代碼並未能看到問題的原因。 –

回答

4

上週我遇到了同樣的問題,終於找到了答案今天。 Path2D對象將其構造函數聲明爲package-private。由於Java序列化要求第一個不可序列化的父類具有無參數構造函數,並且它不可訪問,所以Path2D自身包中不包含的任何Path2D擴展都不會反序列化。老實說,我認爲這是Java的一個漏洞,因爲使用Float/Double子類的所有其他AWT抽象形狀聲明其默認構造函數爲protected。

如果您好奇,我通過跟蹤java.io.ObjectStreamClass.getSerializableConstructor(Class<?>)找到了根本原因。你會發現它找到一個不可訪問的構造函數時會返回null。

相關問題