在将扩展程序加载到程序中时遇到了一个主要问题。我得到一个例外,因为没有有效的构造函数。
I have a major problem during loading the extension into the program. I get an exception as there is no valid constructor.
问题在于:
ekstensja = (ArrayList<Dydaktyk>) ois.readObject();我得到类似的东西:
java.io.InvalidClassException: Dydaktyk; no valid constructor at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(Unknown Source) at java.io.ObjectStreamClass.checkDeserialize(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at java.util.ArrayList.readObject(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at Dydaktyk.wczytajEkstensje(Dydaktyk.java:81) at Dydaktyk.<clinit>(Dydaktyk.java:69) at java.io.ObjectStreamClass.hasStaticInitializer(Native Method) at java.io.ObjectStreamClassputeDefaultSUID(Unknown Source) at java.io.ObjectStreamClass.access$100(Unknown Source) at java.io.ObjectStreamClass$1.run(Unknown Source) at java.io.ObjectStreamClass$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.io.ObjectStreamClass.getSerialVersionUID(Unknown Source) at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.defaultReadFields(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at java.util.ArrayList.readObject(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.defaultReadFields(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at java.util.ArrayList.readObject(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at Przedmiot.wczytajEkstensje(Przedmiot.java:99) at Przedmiot.<clinit>(Przedmiot.java:87) at GUI.main(GUI.java:100)
static { wczytajEkstensje(); // load Extension } public static void wczytajEkstensje() {// load extension FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("dydaktyk.ser"); ois = new ObjectInputStream(fis); // here is the problem ekstensja = (ArrayList<Dydaktyk>) ois.readObject(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (ois != null) { ois.close(); } } catch (IOException e) { } try { if (fis != null) { fis.close(); } } catch (IOException e) { } } } public static void zapiszEkstensje() {// save extension FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("dydaktyk.ser"); oos = new ObjectOutputStream(fos); oos.writeObject(ekstensja); // serialization } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (oos != null) { oos.close(); } } catch (IOException e) { } try { if (fos != null) { fos.close(); } } catch (IOException e) { } } }
推荐答案
类 Dydaktyk 应该有一个可访问的(公共的或受保护的)no-args构造函数,所以序列化反射机制可以创建类的实例:
The class Dydaktyk should have an accessible (public or protected) no-args constructor so that the serialization reflection mechanism can create an instance of the class:
public Dydaktyk() { ... }来自 docs
在反序列化期间,不可序列化的类将使用该类的public或protected no-arg构造函数进行初始化。必须可以对可序列化的子类访问no-arg构造函数。可序列化子类的字段将从流中恢复。
During deserialization, the fields of non-serializable classes will be initialized using the public or protected no-arg constructor of the class. A no-arg constructor must be accessible to the subclass that is serializable. The fields of serializable subclasses will be restored from the stream.
更多推荐
序列化期间没有有效的构造函数
发布评论