我正在尝试序列化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没有实现可序列化吗?但是,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);
}
}发布于 2012-10-09 03:11:40
我上周遇到了同样的问题,今天终于找到了答案。Path2D对象将其构造函数声明为package-private。因为java序列化要求第一个不可序列化的父类有一个无参数的构造函数,并且它是不可访问的,所以任何不在Path2D自己的包中的Path2D扩展都不会反序列化。老实说,我认为这是Java方面的一个错误,因为所有其他使用Float/Double子类的AWT抽象形状都声明它们的默认构造函数是受保护的。
如果你很好奇,我通过追踪java.io.ObjectStreamClass.getSerializableConstructor(Class<?>)找到了根本原因。当它发现一个不可访问的构造函数时,你会发现它返回null。
https://stackoverflow.com/questions/10472508
复制相似问题