序列化期间没有有效的构造函数

编程入门 行业动态 更新时间:2024-10-16 00:17:27
本文介绍了序列化期间没有有效的构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

在将扩展程序加载到程序中时遇到了一个主要问题。我得到一个例外,因为没有有效的构造函数。

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.

更多推荐

序列化期间没有有效的构造函数

本文发布于:2023-11-17 15:01:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1610199.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   序列化

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!